von welchem Object ist dieses Object

  • VB.NET
  • .NET (Standard) 1.0–2.1

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

    von welchem Object ist dieses Object

    Hallo zusammen,
    ich bin neu In diesem Forum. Mal sehen, ob es klappt.
    ich möchte gerne In einem Object das aufrufende Object auslesen können.
    Bsp:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public BR103 As New Lok
    3. Public BR216 As New Lok
    4. End Class
    5. Public Class Lok
    6. Public mein_Motor As New Motor
    7. End Class
    8. Public Class Motor
    9. ' ich möchte hier die Lok abrufen, zu der dieser Motor gehört.
    10. End Class


    es wäre super, wenn mir jemand hierbei helfen.
    Herzlichen Dank

    Code-Tags eingefügt. ~Thunderbolt

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

    Hm, du könntest sowas machen:

    VB.NET-Quellcode

    1. Public Class Lok
    2. Public mein_Motor as New Motor(Me)
    3. End Class
    4. Public Class Motor
    5. Private in_Lok as Lok
    6. Sub New(inlok as Lok)
    7. in_lok = inlok
    8. End Sub
    9. End Class

    Aber ist das sinnvoll? Nein, von der Logik her soll ein Motor von der Lok eigentlich nix wissen.
    Den könnte man ja vermutlich ausbauen und in eine andere baugleiche Lok tun. (bzw.: Eine Lok hat einen Motor, nicht ein Motor hat eine Lok)

    Schau, eine Katastrophe im Debugger...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Herzlichen Dank für den Antwort und den Denkanstoß, der nicht ganz überraschend kommt. :) .
    Ich komme aber immer wieder auf solche Probleme, bei denen ich nicht weiß, wie man diese am elegantesten löst.
    es kann nicht jeder Motor in jede Lok verbaut werden, weil z.B. die eine Lok 6-achsig und die andere 4-achsig ist. Ich versuche in so einem Fall die Klasse Lok von allem zu entlasten, was den Motor betrifft.
    @wuestra Willkommen im Forum. :thumbup:
    Du kannst natürlich dem Motor auch die Lok mitgeben, da hast Du Zugriff auf alle Public Properties:

    VB.NET-Quellcode

    1. Public Class Lok
    2. Public mein_Motor
    3. Public Sub New()
    4. mein_Motor = New Motor(Me)
    5. End Sub
    6. End Class
    Du musst dann natürlich dem Motor einen geeigneten Konstruktor verpassen.
    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!
    es kann nicht jeder Motor in jede Lok verbaut werden

    Das wäre dann ein typischer Fall für Abstraktion. Die erreichst du in dem du für Motor ein Interface erstellst. Dieses Interface implementieren dann alle Motoren. Die Eigenschaft Motor der Lok ist dann nicht mehr vom Typ Motor sonder vom Typ IMotor also dem Interface des Motors. Damit ist der Lokmotor abstrakt und kann sowohl ein 4 Zylinder als auch ein 8 Zylinder usw. sein.

    Edit Beispiel:
    Spoiler anzeigen


    Program

    VB.NET-Quellcode

    1. Friend Class Program
    2. Private Shared Sub Main(ByVal args As String())
    3. Dim lok1 = New Lok() With {
    4. .Motor = New VierZelynderMotor()
    5. }
    6. Dim lok2 = New Lok() With {
    7. .Motor = New AchtZelynderMotor()
    8. }
    9. Console.WriteLine(lok1)
    10. Console.WriteLine(lok2)
    11. Console.ReadLine()
    12. End Sub
    13. End Class



    Lok

    VB.NET-Quellcode

    1. Friend Class Lok
    2. Public Property Motor As IMotor 'Motor Interface
    3. Public Overrides Function ToString() As String
    4. Return $"Der Lok Motor: {Motor.Name}, Ist elektrisch: {Motor.IsElektrifiziert}, Anzahl der Zylinder: {Motor.ZylinderAnzahl}"
    5. End Function
    6. End Class



    Motoren

    VB.NET-Quellcode

    1. Friend Class VierZelynderMotor
    2. Inherits IMotor
    3. Public Property Name As String = "4-Zylinder Motor"
    4. Public Property IsElektrifiziert As Boolean
    5. Public Property ZylinderAnzahl As Integer = 4
    6. End Class
    7. Friend Class AchtZelynderMotor
    8. Inherits IMotor
    9. Public Property Name As String = "8-Zylinder Motor"
    10. Public Property IsElektrifiziert As Boolean
    11. Public Property ZylinderAnzahl As Integer = 8
    12. End Class



    Interface

    VB.NET-Quellcode

    1. Friend Interface IMotor
    2. Private Property Name As String
    3. Private Property IsElektrifiziert As Boolean
    4. Private Property ZylinderAnzahl As Integer
    5. End Interface



    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fakiz“ ()

    @wuestra Deswegen hab ich ja geschrieben "baugleich", die haben also keine Unterschiede.

    Wenn du Kompatibilität zwischen Motor und Lok brauchst dann reicht hier vielleicht auch ein Enum

    VB.NET-Quellcode

    1. Public Class Lok
    2. Public Property Motor as Motor
    3. Public Property Typ as Bauart
    4. Sub New(typ as Bauart)
    5. _Typ = typ
    6. _Motor = New Motor(typ)
    7. End Sub
    8. End Class
    9. Public Class Motor
    10. Public Property Typ as Bauart
    11. Sub New(typ as Bauart)
    12. _Typ = typ
    13. End Sub
    14. End Class
    15. Friend Enum Bauart
    16. SerieXY
    17. SerieIJK
    18. End Enum

    So musst du jeder Lok eine Bauart vorgeben, der Motor wird weiterhin automatisch erzeugt und übernimmt die Bauart der Lok.

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

    Solls was ernsthaftes werden, musste dich in relationale Datenmodellierung einarbeiten.
    Dafür sind im VisualStudio auch Tools enthalten, die dir aus einem Datenmodell dann die Klassen hin-generieren.
    Die Hingenerierten Klassen sind dabei wechselseitig verknüpft, so in etwa, wie du es im Sinne hast, es händisch hinzubasteln.
    hier theoretischer Einstieg: Grundlagen: Relationale Datenmodellierung
    hier Filmle, wies dann praktisch gemacht wird: die vier Views auf Video