virtual,new,override



  • hallo,

    gibt es irgendwo ein tutorial, das den algorithmus zur auflösung von methodenaufrufen in klassenhierarchien in c# gut erklärt? denn ehrlich gesagt versteh ich den ablauf noch nicht so ganz.
    Warum wird z.B. hier erst A::method und dann B::method aufgerufen?

    public class A {
            public virtual void method() {
                Console.WriteLine("A::method()");
            }
        }
    
        public class B : A {
            public new void method() {
                Console.WriteLine("B::method()");
            }
        }
    
        public class C : B {
        }
    
        class Program {     
            static void Main(string[] args){
    
                A a = new C();
                a.method();
                B b = new C();
                b.method();
            }
        }
    


  • Weil A an B vererbt wurde und deshalb, wenn der Konstruktor von B aufgerufen wird, zuerst der Konstruktor von A aufgerufen. Der Konstruktor von B wird aufgerufen, weil B an C vererbt wurde.

    Owei, is das ein Buchstaben- und Konstruktorwirrwar.

    Zerebus



  • Zerebus schrieb:

    Weil A an B vererbt wurde und deshalb, wenn der Konstruktor von B aufgerufen wird, zuerst der Konstruktor von A aufgerufen. Der Konstruktor von B wird aufgerufen, weil B an C vererbt wurde.

    Owei, is das ein Buchstaben- und Konstruktorwirrwar.

    Zerebus

    Hä? 😕 ich hab doch gefragt warum die methoden so aufgerufen werden+. Das mit der konstruktoreihenfolge weiß ich wie das funktioniert 😉



  • wuschl schrieb:

    Warum wird z.B. hier erst A::method und dann B::method aufgerufen?

    Weil B.method nicht die Methode von A redefiniert. Ganz im Gegenteil, du sagst explizit mit new, dass es sich um eine völlig neue Methode handelt, die mit der alten in keiner Beziehung steht. Um die Methode zu redefinieren, musst du override hinschreiben.



  • ja, aber warum wird sie bei B b = new C(); b.method(); aufgerufen? B redefiniert ja method nicht neu, also müsste es doch so ablaufen:
    er schaut in C, findet keine methode method -> geht nach B, findet wieder keine -> geht nach A und dort findet er sie.
    Aber er gibt ja B.method aus, obwohl method nicht überschrieben wurde. wieso? 😕


Anmelden zum Antworten