none
Liste-Objekt um eine Methode/Eigenschaft erweitern RRS feed

  • 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 Class

    Public 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 Class

    Public Class Gewinde
        Public Sub AddAsString(ByVal name As String)
            '....
        End Sub
    End Class

    Dienstag, 16. August 2011 17:59

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-t

     

    Eine 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
    Dienstag, 16. August 2011 19:05
    Beantworter

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-t

     

    Eine 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
    Dienstag, 16. August 2011 19:05
    Beantworter
  • Hallo Elmar,

    wichtig war mir die Möglichkeit einer Erweiterung. Die Erweiterungsmethode war genau das Gesuchte.

    Danke für die Hilfe.

     

    Alexander

    Mittwoch, 17. August 2011 11:34
  • 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

    Mittwoch, 17. August 2011 13:13
    Beantworter