Viele verschiedene Objekte vom selben Typ

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Viele verschiedene Objekte vom selben Typ

    Hi und an alle die es feiern, Frohe Ostern ^^

    Wollte mal nachfragen wie ihr das umsetzen würdet, wenn ihr von einem bestimmten Typ z. B. Klasse Auto mehrere Objekte erstellen müsst.
    Also es gibt eine Liste die alle Autos hält. Diese Autos werden zur Laufzeit erstellt und können in verschiedensten Varienten auftreten.

    Beispiele wären:

    Farbe: Blau
    Modell: Blubb
    PS: 190
    Max. km/h: 250
    Türen: 2
    Typ: XS
    Aktuelle km: 0
    ...

    Wenn man davon jetzt 10 erstellt später nochmal 10 und eben so weiter.
    Nur das es von diesen Bauplänen eben einige gibt, welche alle vom gleichen Typ sind und alle in eine Liste landen sollen.
    Wie macht man das richtig?
    Ich bin mir nicht ganz sicher ob ich dich richtig verstanden habe. Ich hätte folgende Vorschläge:

    1.) Für 10 verschiedene Autos 10 verschiedene Konstruktoren - z.B. indem man dem Konstruktor einen Enum Wert übergibt.
    Jeder Prototyp entspricht einem Enum.

    oder

    2.) Ne Liste mit deinen Prototypen erstellen und aus dieser Liste die Prototypen rauskopieren (über.clone())

    Willst du die Werte deiner Prototypen alle in den Code hardcoden oder von einer Datenbank, Textdatei oder serialiserten Liste lesen?
    "Hardcoden".
    Und das mit der Enum Wert den man dem Konstruktor übergibt, war auch meine Idee nur finde ich sieht das ganze total unsauber aus.
    Also ich hatte es so, das dann durch einen Select Case (übergebener Enum Wert beim New aufruf) die richtigen Werte in das Objekt geschrieben werden, und so nur noch die Art des Typs dem Konstruktor übergeben werden muss.
    Nur ob das so die wahre Lösung ist, bin ich mir nicht sicher.
    Hi
    Das, was markus.obi vorschlägt sieht irgendwie nach Redundanz aus. Wie wäre folgendes? Du hast folgende Klassen:
    - Bauplan (Türen, Sitze, Equipment)
    - AutoProperties (Lack, etc.)
    - AutoModell
    - Auto
    - AutoInstanz (Position des Autos, Rotation oder so)
    und alles, was quasi mehrere Autos in ihrer Kategorie gleich haben, was aber nicht durch Vererbung ausgedrückt werden kann.
    Also: Bauplan ist die Zusammensetzung eines Autos (2 Türen, 3 Lenkräder, etc.), AutoProperties gibt dir die Eigenschaften (Blauer Fahrer, halt wirklich konkrete Werte) an, die eine spezifische Autogruppe (Auto) hat (bei denen alle Instanzen des konkreten Autos gleich sind, z.B. 5x Blubb in Blau). Das Automodell nimmt im Konstruktor einen Bauplan entgegen, das Auto dann das Automodell und due AutoProperties. Die kannst du ggf. auch auf dem Auto selber definieren, wenn die statisch sind. Bei allen AutoInstanz-Instanzen sind alle AutoProperties gleich und ich merk grad, dass ich nen wunderbaren Englisch-Deutsch wechsel drin hab.

    Gruß
    ~blaze~
    Z.b. so:

    VB.NET-Quellcode

    1. Public Class Layout
    2. Private ReadOnly _doors, _wheels As Integer
    3. Public Sub New(ByVal doors As Integer, ByVal wheels As Integer)
    4. _doors = doors
    5. _wheels = wheels
    6. End Sub
    7. Public ReadOnly Property Doors As Integer
    8. Get
    9. Return _doors
    10. End Get
    11. End Property
    12. Public ReadOnly Property Wheels As Integer
    13. Get
    14. Return _wheels
    15. End Get
    16. End Property
    17. End Class
    18. Public Class CarModel
    19. Private ReadOnly _layout As Layout
    20. Public Sub New(ByVal layout As Layout)
    21. _layout = layout
    22. End Sub
    23. Public ReadOnly Property Layout As Layout
    24. Get
    25. Return _layout
    26. End Get
    27. End Property
    28. End Class
    29. Public Class Car
    30. Private ReadOnly _model As CarModel
    31. Private ReadOnly _color As Color
    32. Public Sub New(ByVal auto As CarModel, ByVal color As Color)
    33. _model = auto
    34. _color = color
    35. End Sub
    36. Public ReadOnly Property Color As Color
    37. Get
    38. Return _color
    39. End Get
    40. End Property
    41. Public ReadOnly Property Model As CarModel
    42. Get
    43. Return _model
    44. End Get
    45. End Property
    46. End Class
    47. Public Class CarInstance
    48. Private ReadOnly _car As Car
    49. Public Sub New(ByVal car As Car)
    50. _car = car
    51. End Sub
    52. Public Property PositionX As Single
    53. Public Property PositionY As Single
    54. Public Property PositionZ As Single
    55. Public Property ResprayColor As Color
    56. Public Property Flags As CarInstanceFlags
    57. Public ReadOnly Property Car As Car
    58. Get
    59. Return _car
    60. End Get
    61. End Property
    62. Public ReadOnly Property CarColor As Color
    63. Get
    64. Return If((Flags And CarInstanceFlags.Resprayed) = CarInstanceFlags.Resprayed, ResprayColor, Car.Color)
    65. End Get
    66. End Property
    67. End Class
    68. <Flags()> _
    69. Public Enum CarInstanceFlags
    70. None = 0
    71. IsDriverDrunk = 1
    72. Resprayed = 2
    73. End Enum


    Gruß
    ~blaze~
    Aber würde das nicht darauf hinauslaufen, das ich einfach nur Instanzen erstelle und jede eingenschaft in den Konstruktoren mitgebe?
    Oder ging es um die Sache mit den Flags? Wobei da ja eig. nur das Select Case mit If Abfragen ersetzt wurde.

    Eistee schrieb:

    Aber würde das nicht darauf hinauslaufen, das ich einfach nur Instanzen erstelle und jede eingenschaft in den Konstruktoren mitgebe?

    das wäre das einfachste und gradlinigste.
    Macht auch nicht unbedingt sooo viel Mehrarbeit, denn ob du einen Satz Eigenschaften nun einmal festlegst, oder innerhalb einer Schleife 30 mal - annähernd egal.

    Eine Alternative wäre noch ein Copy-Konstruktor, der anhand eines im Konstruktor übergebenen Auto-"Prototypen" dem neuen Auto identische Eigenschaften verleiht.

    Noch annere Alternative, die ebenfalls einen Klon erzeugt wäre die Implementation der ICloneable-Schnittstelle.
    Letzteres könnte etwas Code einsparen, indem man Base.MemberwiseClone() verwendet, und nur die Properties setzt, die beim MemberwiseClone zu Fehlverhalten führen würden.
    Hierfür ist aber Kenntnis des Unterschiedes von Klasse und Struktur notwendig, sowie verlässliche Bestimmung von ReadOnly Membern.