Grundsatzfrage zur Bekanntheit von Objekten in anderen Objekten



  • Ich bin ja noch in der OOP-Lernphase und würde gern eine grundsätzliche Sache zur Bekanntheit bzw. Bekanntmachung von Objekten innerhalb anderer Objekte für mich klären, am besten an einem konkreten Beispiel.
    Es soll einen Schlitten auf Schienen geben der hin und her fährt. Ein zweiter Schlitten soll in konstantem Abstand mitfahren. Der erste Schlitten ist also der Master, der andere der Slave.

    Das folgende Beispiel wird nicht funktionieren, da das Objekt "MoverSlave" innerhalb des Objekts "MoverMaster" nicht bekannt ist:

    public partial class MainWindow : Window
    {
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            C_MoverMaster MoverMaster = new C_MoverMaster();
            C_MoverSlave MoverSlave = new C_MoverSlave();
    
            MoverMaster.Position = 100;
            MoverMaster.SetSlavePosition();
        }
    }
    
    public class C_MoverMaster
    {
        public double Position { get; set; }
        public void SetSlavePosition()
        {
            MoverSlave.Position = Position + 10;
        }
    }
    
    public class C_MoverSlave
    {
        public double Position { get; set; }
    }
    

    Damit sowas funktioniert muss ich, soweit ich weiss, immer in irgendeiner Form mit dem Schlüsselwort "static" arbeiten. Am Beispiel würde das so aussehen:

    public class C_MoverMaster
    {
        public double Position { get; set; }
        public void SetSlavePosition()
        {
            C_MoverSlave.Position = Position + 10;
        }
    }
    
    public class C_MoverSlave
    {
        public static double Position { get; set; }
    }
    

    Ich kenne die OOP-Richtlinien noch nicht so genau, habe aber den Eindruck, dass so eine Lösung irgendwie Murks ist, und dass wenn man es richtig macht, man auf das Schlüsselwort "static" verzichtet. Stattdessen sollte man seine Struktur so anpassen, dass es auch ohne "static" geht. Das würde dann so aussehen:

    public partial class MainWindow : Window
    {
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            C_MoverMaster MoverMaster = new C_MoverMaster();
    
            MoverMaster.Position = 100;
            MoverMaster.SetSlavePosition();
        }
    }
    
    public class C_MoverMaster
    {
        public MoverSlave MoverSlave = new C_MoverSlave();
        public double Position { get; set; }
        public void SetSlavePosition()
        {
            MoverSlave.Position = Position + 10;
        }
    }
    
    public class C_MoverSlave
    {
        public double Position { get; set; }
    }
    

    Die Objekte "MoverMaster" und "MoverSlave" existieren also nicht mehr "nebeneinander", sondern sind hierarchisch angeordnet. In meinem Projekt, an dem ich gerade arbeite, habe ich das konsequent so durchgezogen, und alle Objekte in einer mehrstufigen Hierarchie organisiert, so dass ich nirgends mit dem Schlüsselwort "static" arbeiten muss. Nun meine zwei Fragen dazu:

    1.) Gibt es, ausgehend vom nicht funktionierenden ersten Beispiel, eine andere bzw. übliche Art, wie man Objekte auf gleicher Hierarchie-Ebene einander bekannt macht (wenn's geht ohne "static")?

    2.) Sehe ich das so richtig, dass die Verwendung von "static" eine Krücke ist die man vermeiden sollte, und dass man, wenn man es richtig machen will, immer mit hierarchischen Strukturen arbeiten sollte?

    Grüsse
    Ank



  • Hallo Ank,

    "static" bedeutet, daß es genau 1 Instanz eines Objektes gibt (die über den Klassennamen angesprochen wird).
    Willst du jedoch mehrere Objekte in Beziehung setzen, so sollte man die Objekte untereinander bekanntmachen (entweder als Konstruktor-Parameter oder aber über eine öffentliche Eigenschaft).

    Du würdest also z.B. dein MoverSlave-Objekt dem MoverMaster-Konstruktor übergeben (ich lasse mal das "C_"-Präfix weg, denn darauf sollte man laut Microsoft-Guideline verzichten):

    public MoverMaster(MoverSlave slave)
    {
      Slave = slave;
    }
    
    public MoverSlave Slave { get; private set; }
    

    Das Erzeugen sähe dann so aus:

    MoverSlave moverSlave = new MoverSlave();
    MoverMaster moverMaster = new MoverMaster(moverSlave); // <- Übergabe der Referenz auf das MoverSlave-Objekt
    

    Für die generelle Kommunikation (insbesondere bei GUI-Programmierung) zwischen verschiedenen Forms und/oder Klassen kann ich dir auch meinen Artikel Kommunikation von 2 Forms empfehlen 😉



  • @Th69

    Super, vielen Dank. Wieder was Wichtiges dazugelernt 🙂

    Ist das Kovention die Klasse immer gross und das Objekt immer klein zu schreiben?




Log in to reply