Problem mit Interface



  • Hallo,

    Ich habe eine Basisklasse B, welche eine List<A> als member enthält. Nun möchte ich das Klassen, die von B abgeleitet werden, diese Liste, bzw. die enthaltenen Elemente, in verschiedener Weise benutzen können. Das versuche ich mittels Interfaces zu realisieren.
    Es tritt aber nun das Problem auf, das sich initialisierte Werte nicht mehr ändern lassen:

    C some = new C(100, 200);  // C ist von B abgeleitet
    some.a = 123;  // keine Wirkung
    System.Console.WriteLine("a:" + some.a.ToString());
    

    Was ist das Problem hierbei und wie kann ich es lösen?

    Hier die Klassen- und Interfacedefinitionen:

    class A
        {
            public double a=0;
            public double b=0;
            public A()
            {
            }
            public A(double a, double b)
            {
                this.a = a;
                this.b = b;
            }
        }
    
        interface IB
        {
            List<A> elements { get; }
        }
    
        class B : IB
        {
            protected List<A> _elements;
            public B()
            {
                this._elements = new List<A>();
            }
    
            public List<A> elements
            {
                get { return this._elements; }
            }
        }
    
        interface IC
        {
            double a { set; get; }
            double b { set; get; }
        }
    
        class C : B,IC
        {
            public C()
            {
                this._elements.Add(new A());
            }
    
            public C(double a, double b)
            {
                this._elements.Add(new A(a, b));
            }
    
            public double a
            {
                set { this._elements[0].a = a; }
                get { return this._elements[0].a; }
            }
    
            public double b
            {
                set { this._elements[0].b = b; }
                get { return this._elements[0].b; }
            }
        }
    


  • Deine Klasse c ist schmarn, wozu wird darin eine Liste benötigt, wenn am Ende sowieso nur auf das erste Element zugegriffen wird?

    Folgendes im Setter ist genauso quatsch:

    this._elements[0].a = a;
    

    korrekt ist:

    this._elements[0].a = value;
    


  • hi,

    inflames2k schrieb:

    korrekt ist:

    this._elements[0].a = value;
    

    das hatte ich dann wohl falsch verstanden - danke

    inflames2k schrieb:

    Deine Klasse c ist schmarn, wozu wird darin eine Liste benötigt, wenn am Ende sowieso nur auf das erste Element zugegriffen wird?

    In anderen abgeleiteten Klassen werden mehrere Elemente benutzt - Klasse C ist der einfachste Fall.

    Ich hab noch eine weitere Frage: Kann man in der Klasse C den geerbten (?) Interface accessor elements ausblenden, so das er nur noch von der Basisklasse heraus zugreifbar ist?



  • Bist du dir ganz sicher, dass dein Klassendesign richtig gewählt ist?



  • inflames2k schrieb:

    Bist du dir ganz sicher, dass dein Klassendesign richtig gewählt ist?

    nicht wirklich.
    Ich habe viel Jahre C und Assembler programmiert und es fällt mir daher (immer) noch schwer Objektorientier zu denken...
    Meine Ide in diesem Fall war es, das ich meine Klassen um die List<> herum baue und zusätzliche Eigenschaften, die sich ausschließlich aus den Elementen in List<> ergeben, über ein Interface zur Verfügung stelle...
    Ich werde es jetzt mal so probieren.



  • Hat C denn überhaupt etwas mit B gemeinsam?
    Nach deiner Erläuterung würde ich C nämlich so implementieren:

    class C
    {
        private A _a;
    
        public double a
        {
           set { _a.a = value; }
           get { return _a.a; }
        }
    
        public double b
        {
           set { _a.b = b; }
           get { return _a.b; }
        }   
    }
    

    Zusätzlich noch zum Thema OOP:
    Das deine Basisklasse B eine Liste enthält bedeuted nicht, dass sie die selben Einträge hat wie eine Liste in Klasse C.

    // Und auch das nicht unbedingt, denn in dem Zustand entspricht ja C 1 zu 1 A.



  • inflames2k schrieb:

    Hat C denn überhaupt etwas mit B gemeinsam?[/cs]

    ja, die List. Die Objekte der von B abgeleiteten Klassen sollten wiederum in einer Liste gespeichert werden.
    Dazu casten ich (so zumindest mein Ide) sie zur Basisklasse und speichere sie dann in einer List<B> - dadurch kann ich dann unabhängig von der Abgeleitet Klasse die Elemente A auslesen und z.B. vergleichen.



  • Damit hat sich aber die Frage

    Ich hab noch eine weitere Frage: Kann man in der Klasse C den geerbten (?) Interface accessor elements ausblenden, so das er nur noch von der Basisklasse heraus zugreifbar ist?

    erledigt.


Anmelden zum Antworten