geerbte Methoden mit "new" verdecken



  • hi

    Mir ist nicht klar was genau der Unterschied bei einer new-Methode im Vergleich zu einer override-Methode ist.
    Virtuelle Methoden kenn ich aus C++.
    Override ist wohl in C# nur dazu gekommen, um zu sagen "hier wird eine virtuelle Methode überschrieben". Um das quasi zu verdeutlichen.

    Die Definition von verdeckenden Methoden mit new ist ja dieselbe wie von virtuellen. Methoden können wenn sie vererbt werden überschrieben werden.
    Ist doch auch nur Polymorphie oder?

    Ich könnte mir vorstellen, da man virtuelle Methoden ja eigentlich nur bei abstrakten Klassen oder Interfaces als "abstrakte Methoden" anwendet,
    man bei new in der Basisklasse fertig implementierte Methoden überschreibt.
    Lieg ich da richtig?

    class A
        {
            public void Methode() { Console.WriteLine("A"); }
        }
    
        class B : A
        {
            public new void Methode() { Console.WriteLine("B"); }
        }
    
            static void Main(string[] args)
            {
                B b = new B();
                b.Methode();        //Ausgabe: B
                Console.ReadLine();
            }
    
    class A
        {
            public virtual void Methode() { Console.WriteLine("A"); }
        }
    
        class B : A
        {
            public override void Methode() { Console.WriteLine("B"); }
        }
    
            static void Main(string[] args)
            {
                B b = new B();
                b.Methode();        //Ausgabe: B
                Console.ReadLine();
            }
    

    sry für den Roman 😉



  • New-Methoden sind nicht virtuell, du hast also keine Laufzeit-Polymorphie. That's it.



  • New-Methoden sind nicht virtuell, du hast also keine Laufzeit-Polymorphie. That's it.

    Stimmt.

    Hab im Internet folgenden Text gefunden:

    Wenn man in einer Oberklasse eine Methode M einführt, die es in einer Unterklasse bereits gibt, dann verlangt C#, dass man M in der Unterklasse mit new verdeckt und damit ausdrückt, dass das M in der Unterklasse das M aus der Oberklasse nicht überschreibt.

    Eine Alternative dazu wäre, dass man den Namen von M in der Unterklasse ändert (z.B. auf M1). Damit wäre ebenfalls ausgedrückt, dass es sich nicht um eine Überschreibung handelt.

    Der Vorteil läge darin, dass man das komplexe Konzept des Verdeckens nicht bräuchte. Die dynamische Bindung wäre wesentlich einfacher zu verstehen, da dann jeder Methodenaufruf obj.M() einfach die Methode M des dynamischen Typs von obj aufriefe.

    Nachteilig wäre, dass eine Änderung von M auf M1 u.U. aufwändig oder vielleicht gar nicht mehr möglich ist, da sonst zu viele andere Programme invalidiert würden. Außerdem wäre das M aus der Oberklasse nicht versteckt, sondern könnte in der Unterklasse nach wie vor verwendet werden, was u.U. nicht gewünscht ist.

    new drückt also aus, dass es sich nicht um eine Überschreibung handelt obwohl die Methode gleich heißt. Ziemlich sinnlos. Warum gibt man der nicht einfach einen neuen Namen. 🙄



  • Das macht man meistens auch. Das new ist aber nicht sinnlos, denn es verhindert, dass du *aus Versehen* eine Methode verdeckst.


Anmelden zum Antworten