OOP - Eigenschaften von zwei Klassen abgleichen, die sich von einer Basisklasse ableiten.

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von FredM.

    OOP - Eigenschaften von zwei Klassen abgleichen, die sich von einer Basisklasse ableiten.

    Folgendes Beispiel:

    Ich habe eine Basisklasse und zwei Klassen die sich davon Ableiten mit ein paar zusätzlichen Eingenschaften.

    Nun möchte ich folgendes tun. In meinem Code später habe ich eine Instanz AppSettings laufen und viele Instanzen DocSettings.
    Jetzt möchte ich zu einen gegebenen Zeitpunkt alle Eigenschaften der Basisklasse meiner AppSettings Instanz in eine DocSettings Instanz schreiben.
    Natürlich könnte ich das einfach per Zuweisung DocSetting.P1 = AppSetting.P1, aber gibts da vielleicht einen schöneren Weg in einer Schleife oder so?
    Ist halt Pflegeleichter, weil wenn ich das in einer Schleife realisieren könnte, müsste ich dann einfach nur eine neue Eigenschaft hinzufügen und das wars, und nicht noch woanders im Code die Zuweisung hinzufügen.

    VB.NET-Quellcode

    1. Public Class BasicSettings
    2. Public Property P1 As String = ""
    3. Public Property P2 As String = ""
    4. Public Property P3 As String = ""
    5. Public Property P4 As Integer = 0
    6. Public Property P5 As Integer = 0
    7. End Class
    8. Public Class AppSettings
    9. Inherits BasicSettings
    10. Public Property A1 As String = ""
    11. Public Property A2 As Integer = 0
    12. End Class
    13. Public Class DocSettings
    14. Inherits BasicSettings
    15. Public Property D1 As Integer = 0
    16. Public Property D2 As Integer = 0
    17. Public Property D3 As String = ""
    18. End Class
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

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

    VB.NET-Quellcode

    1. Dim ap As AppSettings = '...
    2. Dim dsList As List(Of DocSettings) = '...
    3. For Each ds In dsList
    4. ds.D1 = ap.A1
    5. ds.D2 = ap.A2
    6. '...
    7. Next


    Oder wenn du nur alle P Variablen kopieren willst (die haben ja beide Unterklassen):

    VB.NET-Quellcode

    1. Dim ap As AppSettings = '...
    2. Dim dsList As List(Of DocSettings) = '...
    3. For Each ds In dsList
    4. ds.P1 = ap.P1
    5. ds.P2 = ap.P2
    6. '...
    7. Next


    Du könntest natürlich statt P1, P2, P3 auch einfach ein Array daraus machen, fall sie den gleichen Datentyp besitzen.

    Du willst alle Variablen auf einmal kopieren? Glaub jetzt hab ich verstanden was du meinst:
    Du brauchst eine Struktur:

    VB.NET-Quellcode

    1. Public Structure DatenZumUebergeben
    2. Dim P1 As Integer
    3. Dim P2 As Integer
    4. '...
    5. End Structure


    Später hast du die gesamten Daten deines Objektes in einer Instanz der Strukur:

    VB.NET-Quellcode

    1. Dim dzu As New DatenZumUebergeben


    Geht das in deine Richtung?

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Lass die abgeleiteten Klassen doch zusätzlich noch einen Methode erben, die eine Instanz von BasicSettings entgegen nimmt und deren Werte in die eigenen Properties schreibt.

    VB.NET-Quellcode

    1. Public Class BasicSettings
    2. Public Property P1 As String = ""
    3. Public Property P2 As String = ""
    4. Public Property P3 As String = ""
    5. Public Property P4 As Integer = 0
    6. Public Property P5 As Integer = 0
    7. Public Sub InsertSettings(ByVal SetObj As BasicSettings)
    8. P1 = SetObj.P1
    9. P2 = SetObj.P2
    10. 'und so weiter...
    11. End Sub
    12. End Class
    @FuFu^^
    Sowas würde ich dann aber eher im Konstruktor regeln.

    VB.NET-Quellcode

    1. Sub New(settings As BasicSettings)

    Damit ließe sich das dann sogar in der Basisklasse regeln, wodurch alle abgeleiteten Klassen ineinander konvertierbar wären.

    FredM schrieb:

    Jetzt möchte ich zu einen gegebenen Zeitpunkt...

    @Artentus: Dem entnehme ich für meinen Teil, dass das Übernehmen der "Basic-Properties" nicht zwingend auf den Zeitpunkt der Instanzierung der Objekte der abgleiteten Klassen fällt.


    Wenn du dir meinen Code ansiehst wirst du feststellen, dass ich das ebenfalls in der Basisklasse regele.
    ja richtig FuFu das übernehmen der Basic-Props passiert nicht zum Zeitpunkt der Instanzierung. Und vom gleichen Typ sind die eingeschaften nicht. Gibt String, Boolean und Integer.
    Irgendwie möchte ich halt die beiden abgeleiteten Klassen ineinander konvertieren können.

    Eine Instanz der Basisklasse gibt es bei mir im Code nicht. Die hab ich nur damit ich sie vererben kann.
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Ok so gehts :) Gibts noch ein anderen Weg nach Rom, wie war das mit den Strukturen?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim aps As New AppSettings
    3. Dim dos As New DocSettings
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. aps.P1 = "test1"
    6. aps.P2 = "test2"
    7. dos.P1 = "asdf1"
    8. dos.P2 = "asdf2"
    9. MsgBox(dos.P1)
    10. dos.InsertSettings(aps)
    11. MsgBox(dos.P1)
    12. End Sub
    13. End Class
    14. Public Class BasicSettings
    15. Public Property P1 As String = ""
    16. Public Property P2 As String = ""
    17. Public Property P3 As String = ""
    18. Public Property P4 As Integer = 0
    19. Public Property P5 As Integer = 0
    20. Public Sub InsertSettings(ByVal SetObj As BasicSettings)
    21. P1 = SetObj.P1
    22. P2 = SetObj.P2
    23. P3 = SetObj.P3
    24. P4 = SetObj.P4
    25. P5 = SetObj.P5
    26. End Sub
    27. End Class
    28. Public Class AppSettings
    29. Inherits BasicSettings
    30. Public Property A1 As String = ""
    31. Public Property A2 As Integer = 0
    32. End Class
    33. Public Class DocSettings
    34. Inherits BasicSettings
    35. Public Property D1 As Integer = 0
    36. Public Property D2 As Integer = 0
    37. Public Property D3 As String = ""
    38. End Class
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    Jetzt möchte ich zu einen gegebenen Zeitpunkt alle Eigenschaften der Basisklasse meiner AppSettings Instanz in eine DocSettings Instanz schreiben.
    Natürlich könnte ich das einfach per Zuweisung DocSetting.P1 = AppSetting.P1, aber gibts da vielleicht einen schöneren Weg in einer Schleife oder so?
    Nein, ums Zuweisen jeder einzelnen Property kommste nicht drumrum, es sei denn du bemühst Reflection, aber das soll ziemlich unperformant sein.
    Ich nenne so eine Methoden gerne "CopyTo(other As Type)", und könnteste in diesem Fall auch inne Basisklasse anlegen.
    Möglicherweise kannst du eine Instanz einer Erbenden Klasse auch mit einer der Basisklasse überschreiben. Dann gehen allerdings die Werte der neuen Properties im Objekt der abgeleiteten Klassen verloren.
    Zwecks Konvertierbarkeit der abgeleiteten Objekte vielleicht auch mal mit Interfaces beschäftigen?


    Ich würd's so lassen wie du es jetzt hast. Falls du extrem viele Properties in der Basisklasse hast, könntest du den Code ggf. noch mit Reflection und Schleifen kürzen.
    //Na super, Erfinder :\ :D
    Danke mal so weit. :thumbup:

    So gehts auch, allerdings finde ich das nicht so schön, da jetzt die Basicsettings nur über die variable bs. aufrufbar ist.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim aps As New AppSettings
    3. Dim dos As New DocSettings
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. aps.bs.P1 = "test1"
    6. dos.bs.P1 = "asdf1"
    7. MsgBox(dos.bs.P1)
    8. dos.bs = aps.bs
    9. MsgBox(dos.bs.P1)
    10. End Sub
    11. End Class
    12. Public Structure BasicSettings
    13. Public Property P1 As String
    14. Public Property P2 As String
    15. Public Property P3 As String
    16. Public Property P4 As Integer
    17. Public Property P5 As Integer
    18. End Structure
    19. Public Class AppSettings
    20. Public bs As New BasicSettings
    21. Public Property A1 As String = ""
    22. Public Property A2 As Integer = 0
    23. End Class
    24. Public Class DocSettings
    25. Public bs As New BasicSettings
    26. Public Property D1 As Integer = 0
    27. Public Property D2 As Integer = 0
    28. Public Property D3 As String = ""
    29. End Class
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Hier noch meine Schleife über alle Properties :)

    VB.NET-Quellcode

    1. Public Sub InsertSettings(ByRef SetObj As BasicSettings)
    2. Dim bs As New BasicSettings
    3. For Each prop In bs.GetType.GetProperties()
    4. Dim target_prop As System.Reflection.PropertyInfo = Me.GetType.GetProperty(prop.Name)
    5. Dim source_prop As System.Reflection.PropertyInfo = SetObj.GetType.GetProperty(prop.Name)
    6. target_prop.SetValue(Me, source_prop.GetValue(SetObj, Nothing), Nothing)
    7. Next
    8. End Sub
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix