indizierte Instanzen einer Klasse

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von BiedermannS.

    Meinst Du so was:

    VB.NET-Quellcode

    1. Public Class Class1
    2. Private Shared _Index As Integer = 0
    3. Private MyIndex As Integer = 0
    4. Public ReadOnly Property Index As Integer
    5. Get
    6. Return MyIndex
    7. End Get
    8. End Property
    9. Public Sub New()
    10. MyIndex = _Index
    11. _Index += 1
    12. End Sub
    13. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nein, sonder so etwas. Sollte aber keine Fehlmeldung produzieren.

    VB.NET-Quellcode

    1. Public Class Feld
    2. Private FeldValue() As Ziffer ' = Class Ziffer
    3. Private _z() As Ziffer
    4. ' Eigenschaft
    5. Public Property Zi(ByVal I As Integer) As Ziffer
    6. Get
    7. Return _z(I)
    8. End Get
    9. Set(ByVal FeldValue As Ziffer)
    10. _z(I) = FeldValue
    11. End Set
    12. End Property
    13. ' Methode
    14. Public Sub LöschenEine(ByVal ZifferA As Integer)
    15. Zi(ZifferA).Löschen("Reihe")
    16. Zi(ZifferA).Löschen("Spalte")
    17. End Sub
    18. 'End Sub
    19. ' Konstruktor
    20. Public Sub New()
    21. For I = 0 To 2
    22. Zi(I) = New Ziffer
    23. Next
    24. End Sub
    25. End Class

    VB.NET-Quellcode

    1. Public Class Sodoku
    2. Private Property Fe As Feld
    3. Private Sub Sodoku_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. Fe = New Feld()
    5. Stop
    6. End Sub
    7. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Investmentclub“ ()

    Investmentclub schrieb:

    Sollte aber keine Fehlmeldung produzieren.
    wenn Du uns mitteilst, was Ziffer ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Public Class Ziffer
    2. Private ReiheValue As Boolean
    3. Private SpalteValue As Boolean
    4. ' Eigenschaft
    5. Public Property Reihe() As Boolean
    6. Get
    7. ' Gets the property value.
    8. Return ReiheValue
    9. End Get
    10. Set(ByVal Value As Boolean)
    11. ' Sets the property value.
    12. ReiheValue = Value
    13. End Set
    14. End Property
    15. Public Property Spalte() As Boolean
    16. Get
    17. ' Gets the property value.
    18. Return SpalteValue
    19. End Get
    20. Set(ByVal Value As Boolean)
    21. ' Sets the property value.
    22. SpalteValue = Value
    23. End Set
    24. End Property
    25. ' Methode
    26. Public Sub Löschen(Optional ByVal BereichA As String = "Reihe", Optional ByVal BereichB As String = "")
    27. If BereichA = "Reihe" Or BereichB = "Reihe" Then
    28. Me.ReiheValue = False
    29. End If
    30. If BereichA = "Spalte" Or BereichB = "Spalte" Then
    31. Me.SpalteValue = False
    32. End If
    33. End Sub
    34. ' Konstruktor
    35. Public Sub New()
    36. ' Set the property value
    37. Me.Reihe = True
    38. Me.Spalte = True
    39. End Sub
    40. End Class

    Investmentclub schrieb:

    VB.NET-Quellcode

    1. Public Sub Löschen(Optional ByVal BereichA As String = "Reihe", Optional ByVal BereichB As String = "")
    Die Übergabe eines Strings ("Reihe", "Spalte", "Quadrat" ?) ist suboptimal. Mit einem entsprechenden Enumber geht das viel eleganter:

    VB.NET-Quellcode

    1. Public Enum Bereich
    2. Zeile
    3. Spalte
    4. Quadrat
    5. End Enum
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Investmentclub schrieb:

    hilft mir aber nicht wirklich weiter zumal "ENUM" nicht für den Typ "Boolean" geeignet ist.

    ???

    If BereichA = MeineEnum.Spalte orelse BereichB = MeineEnum.Spalte then


    VB.NET-Quellcode

    1. Private _z() As Ziffer
    2. ' Eigenschaft
    3. Public Property Zi(ByVal I As Integer) As Ziffer
    4. Get
    5. Return _z(I)
    6. End Get
    7. Set(ByVal FeldValue As Ziffer)
    8. _z(I) = FeldValue
    9. End Set
    10. End Property

    Du deklarierst ein Array OHNE Dimension und greifst dann auf den Index zu. Wie soll das bitteschön gehen?
    Willst du eine Indizierte Instanz oder eine indizierte Eigenschaft??

    bei zweiterem, entweder:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim t As New test
    3. t.array1 = {1, 2, 3, 4, 5}
    4. MsgBox(t.array1(3))
    5. t.array1(3) = 7
    6. MsgBox(t.array1(3))
    7. End Sub
    8. Public Class test
    9. Private _array1 As Integer()
    10. Public Property array1() As Integer()
    11. Get
    12. Return _array1
    13. End Get
    14. Set(value As Integer())
    15. _array1 = value
    16. End Set
    17. End Property
    18. End Class


    oder als List(of T)

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim t As New test
    3. t.array1 = {1, 2, 3, 4, 5}.ToList
    4. MsgBox(t.array1(3))
    5. t.array1(3) = 7
    6. MsgBox(t.array1(3))
    7. End Sub
    8. Public Class test
    9. Private _array1 As New List(Of Integer)
    10. Public Property array1() As List(Of Integer)
    11. Get
    12. Return _array1
    13. End Get
    14. Set(value As List(Of Integer))
    15. _array1 = value
    16. End Set
    17. End Property
    18. End Class
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    mir ist die Frage noch ganz unklar. In c# gibts zB. die Möglichkeit, einen Indexer zu proggen - in vb nähme man dafür einfach das Default-Schlüsselwort her.
    Aber wie gesagt: Unklar, was dein Ziel ist: "Indizierte Instanzen einer Klasse" findest du in jedem Array, aber zB auch in Dictionaries.

    ErfinderDesRades schrieb:

    mir ist die Frage noch ganz unklar.


    Ich versuche es noch mal mit einem Beispiel:

    VB.NET-Quellcode

    1. ' Konstruktor
    2. Public Sub New()
    3. X1 = New Ziffer
    4. X2 = New Ziffer
    5. For I = 0 To 2
    6. Zi(I) = New Ziffer
    7. Next
    8. End Sub


    Ich möchte die Instanzen X1,X2.......Xn durch Zi(I) ersetzen.

    So dass aus der Anweisung Fe.X1.Löschen() Fe.Zi(1).Löschen() wird.
    X1 und X2 funktionieren.


    VB.NET-Quellcode

    1. Debug.Print(Fe.X1.Reihe & " " & Fe.X2.Reihe)
    2. Fe.X1.Löschen()
    3. Fe.Zi(1).Löschen()
    4. Debug.Print(Fe.X1.Reihe & " " & Fe.X2.Reihe)
    5. Debug.Print(Fe.Zi(1).Reihe)


    Die Eigenschaft von X1 ist definiert als:

    VB.NET-Quellcode

    1. ' Eigenschaft
    2. Public Property X1 As Ziffer
    3. Get
    4. Return _X1
    5. End Get
    6. Set(ByVal X1Value As Ziffer)
    7. _X1 = X1Value
    8. End Set
    9. End Property

    BiedermannS schrieb:

    Willst du eine Indizierte Instanz oder eine indizierte Eigenschaft??

    bei zweiterem, entweder:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim t As New test
    3. t.array1 = {1, 2, 3, 4, 5}
    4. MsgBox(t.array1(3))
    5. t.array1(3) = 7
    6. MsgBox(t.array1(3))
    7. End Sub
    8. Public Class test
    9. Private _array1 As Integer()
    10. Public Property array1() As Integer()
    11. Get
    12. Return _array1
    13. End Get
    14. Set(value As Integer())
    15. _array1 = value
    16. End Set
    17. End Property
    18. End Class


    Hab ich doch schon geschrieben....
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:


    ....

    VB.NET-Quellcode

    1. t.array1(3) = 7

    .....
    Hab ich doch schon geschrieben....


    Um in Deinem Beispiel zu bleiben. Ich suche nach einer Lösung in der sinngemäss

    VB.NET-Quellcode

    1. t(2).array1(3) = 7 bzw
    2. t(1).array1(2) = 5


    funktioniert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Investmentclub“ ()

    Ich stehe jetzt völlig auf’n Schlauch.

    In dem o.g. Beispiel ist t(2) die Bezeichnung einer Instanz von TingsBums,
    man könnte diese Bezeichnung durch tabc ersetzen ohne Funktionsänderung,
    t(2) ist nicht das 3.Element eines Array.

    Sondern t(2).array1(3) ist das 4. Element einers 1 dimensionaler Array.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Investmentclub“ ()

    wie gesagt: ich habe erheblich Schwierigkeiten, zu verstehen, was du willst.

    jdfs. mein post ist eine Lösung der Anforderung post#15

    Investmentclub schrieb:

    t(2) ist nicht das 3.Element eines Array.
    Wie kannst du sowas behaupten? Natürlich ist t(2) das 3.Element eines Arrays.


    Hingegen

    Investmentclub schrieb:

    Sondern t(2).array1(3) ist das 4. Element einers 1 dimensionaler Array.
    erschließt sich mir ühaupt nicht.

    Edit: Ah - jetzt habichs: du hast doch recht (ebenso wie ich): .array1(3) ist das 4. Element eines 1 dimensionalen Arrays.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich mische mich auch mal ein xD
    So wie ich "Ich möchte die Instanzen X1,X2.......Xn durch Zi(I) ersetzen." verstehe willst du an einer zentralen Stelle Zugriff auf alle jemals erstellten Instanzen deiner Klasse haben. Ist das richtig?

    VB.NET-Quellcode

    1. Public Class Class1
    2. Public Shared Instanzen As New List(Of Class1)
    3. Private index As Integer = 0
    4. Public Sub New()
    5. index = Instanzen.Count
    6. Instanzen.Add(Me)
    7. End Sub
    8. End Class


    Somit hättest du immer auf alle Instanzen zugriff via:

    VB.NET-Quellcode

    1. Class1.Instanzen(xyz)



    Bzw fällt mir da grade noch eine Möglichkeit ein, wie ich Post#12 deuten kann:
    Du hast mehrere Variablen, die nicht in einem Array hinterlegt sind. Diese willst du aber trotzdem mit einer Schleife durchlaufen um so Code einzusparen?

    Edit: und wenn das dein Problem nicht löst, dann erzähl doch mal, was du genau vor hast. Das Problem zu umschreiben ist eher hinderlich.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()