Benutzer mit den meisten Antworten
Liste-Objekt um eine Methode/Eigenschaft erweitern

Frage
-
Hallo,
ich will das Objekt Gewinde (eine Liste) um die Methode/Eigenschaft AddAsString erweitern, so dass
schraubeX.Gewinde.AddAsString(... zur Verfügung steht (genau in dieser Reihenfolge).
Wie kann ich das am Beispiel realisieren?Alexander
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim schraubeX As Schraube = New Schraube()
'schraubeX.Gewinde. ' hier soll stehen schraubeX.Gewinde.AddAsString(...End Sub
End ClassPublic Class Schraube
Private _gewinde As List(Of Gewinde)Public Property Gewinde As List(Of Gewinde)
Get
Return Me._gewinde
End Get
Set(ByVal value As List(Of Gewinde))
Me._gewinde = value
End Set
End Property
End ClassPublic Class Gewinde
Public Sub AddAsString(ByVal name As String)
'....
End Sub
End Class
Antworten
-
Hallo Alexander,
die Antwort hast Du in Objektmodell-Frage schon bekommen, auch wenn Dir das vielleicht nicht bewusst ist.
Denn ob Schrauben mit Gewinden oder Layer mit Linien:
Der reguläre Weg wäre, eine Ableitung von List(T) oder besser Collection(T) zu erstellen.
Eine Collection(T) ist nichts weiter als eine List(T), wo jedoch nicht die vielen Zusatzmethoden auftauchen,
denn i. a. sollte eine öffentliche Schnittstelle so schlank wie möglich gehalten werden
(merkt man spätestens wenn man eine Dokumentation dafür schreiben muss ;-)
List(T) sollte man deswegen nur für interne Zwecke verwenden:
http://stackoverflow.com/questions/398903/what-is-the-difference-between-list-of-t-and-collectionof-tEine Alternative wäre theoretisch eine Erweiterungsmethode.
Darauf sollte man hier verzichten; sonst hast Du nach einiger Zeit hunderte von
Erweiterungsmethoden für List(T), womit Du den Überblick verlieren dürftest.
Die sollte man nur für allgemein verwendbare Methoden (sparsam) einsetzen.Gruß Elmar
- Als Antwort markiert AlexanderRi Mittwoch, 17. August 2011 11:24
Alle Antworten
-
Hallo Alexander,
die Antwort hast Du in Objektmodell-Frage schon bekommen, auch wenn Dir das vielleicht nicht bewusst ist.
Denn ob Schrauben mit Gewinden oder Layer mit Linien:
Der reguläre Weg wäre, eine Ableitung von List(T) oder besser Collection(T) zu erstellen.
Eine Collection(T) ist nichts weiter als eine List(T), wo jedoch nicht die vielen Zusatzmethoden auftauchen,
denn i. a. sollte eine öffentliche Schnittstelle so schlank wie möglich gehalten werden
(merkt man spätestens wenn man eine Dokumentation dafür schreiben muss ;-)
List(T) sollte man deswegen nur für interne Zwecke verwenden:
http://stackoverflow.com/questions/398903/what-is-the-difference-between-list-of-t-and-collectionof-tEine Alternative wäre theoretisch eine Erweiterungsmethode.
Darauf sollte man hier verzichten; sonst hast Du nach einiger Zeit hunderte von
Erweiterungsmethoden für List(T), womit Du den Überblick verlieren dürftest.
Die sollte man nur für allgemein verwendbare Methoden (sparsam) einsetzen.Gruß Elmar
- Als Antwort markiert AlexanderRi Mittwoch, 17. August 2011 11:24
-
Hallo Alexander,
ich kann Dir in dem Zusammenhang von Erweiterungsmethode nur abraten.
Eine Erweiterungsmethode mag im ersten Moment schneller geschrieben sein.
Auf lange Sicht erhältst Du aber einen Verhau von Methoden, die bei List(Of) auftauchen.Die sind dafür schlicht und einfach nicht gedacht.
Da sollte man schon den Weg der Ableitung (aka Vererbung) gehen, wie es die OOP in ihren Grundlagen vorsieht.Und spätestens wenn noch mehr stattfinden soll, z. B. ein Verweis auf die Schraube, ist es mit der Erweiterung vorbei.
Und wenn Du das später mal über eine größere Anzahl Klassen umstellen musst,
wird es bitter, wie schon mal jemand (nicht ich) feststellen musste.Und so aufwändig ist es nun nicht:
Public Class Schraube Private _gewinde As New GewindeCollection() Public ReadOnly Property Gewinde() As GewindeCollection Get Return _gewinde End Get End Property End Class Public Class Gewinde Public Property Name() As String End Class ' Hier ObservableCollection (für WPF geeigneter) Public Class GewindeCollection Inherits System.Collections.ObjectModel.ObservableCollection(Of Gewinde) Public Overloads Function Add(name As String) As Gewinde Dim item = New Gewinde() With { .Name = name } Me.Items.Add(item) Return item End Function End Class
Ich habe dabei Add als "natürlichere" Bezeichnung für eine Erzeugung als Zeichenkette gewählt,
so wie man es auch im Framework aller Orten findet.
Und da Du im WPF Forum aktiv bist, habe ich gleich eine ObservableCollection daraus gemacht,
die eignet sich besser für die Datenbindung.Gruß Elmar