Zwingende ist, wenn Sie eine neue override
Implementierung einer Methode in einer abgeleiteten Klasse zur Verfügung stellen, wenn diese Methode in der Basisklasse als virtual
definiert ist.
Verstecke sind, wenn Sie eine neue Implementierung eines Verfahrens in einer abgeleiteten Klasse zur Verfügung stellen, wenn diese Methode nicht in der Basisklasse als virtual
, oder wenn Ihre neue Implementierung ist nicht festgelegt override
definiert ist.
Verstecken ist sehr oft schlecht; Sie sollten generell versuchen, es nicht zu tun, wenn Sie es überhaupt vermeiden können. Verstecken kann dazu führen, dass unerwartete Dinge passieren, weil verdeckte Methoden nur verwendet werden, wenn sie für eine Variable des von Ihnen definierten Typs aufgerufen werden, nicht wenn eine Basisklassenreferenz verwendet wird. Andererseits werden virtuelle Methoden, die überschrieben werden, enden Die richtige Methodenversion wird aufgerufen, auch wenn sie mit der Basisklassenreferenz einer untergeordneten Klasse aufgerufen wird.
Betrachten wir zum Beispiel diese Klassen:
public class BaseClass
{
public virtual void Method1() //Virtual method
{
Console.WriteLine("Running BaseClass Method1");
}
public void Method2() //Not a virtual method
{
Console.WriteLine("Running BaseClass Method2");
}
}
public class InheritedClass : BaseClass
{
public override void Method1() //Overriding the base virtual method.
{
Console.WriteLine("Running InheritedClass Method1");
}
public new void Method2() //Can't override the base method; must 'new' it.
{
Console.WriteLine("Running InheritedClass Method2");
}
}
ist es so Nennen wir, mit einer Instanz von InheritedClass, in einem passenden Referenz:
InheritedClass inherited = new InheritedClass();
inherited.Method1();
inherited.Method2();
Das gibt, was Sie erwarten sollten; Beide Methoden geben an, dass sie die InheritedClass-Versionen ausführen.
Lauf InheritedClass Method1
Lauf InheritedClass Method2
Dieser Code eine Instanz der gleichen, InheritedClass schafft, sondern speichert sie in einem Baseclass-Referenz:
BaseClass baseRef = new InheritedClass();
baseRef.Method1();
baseRef.Method2();
Normalerweise unter OOP Prinzipien, sollten Sie die gleiche Ausgabe wie im obigen Beispiel erwarten. Aber Sie müssen nicht die gleiche Leistung erhalten:
Lauf InheritedClass Method1
Laufbaseclass Method2
Wenn Sie den Code InheritedClass schrieb, haben Sie alle Anrufe an Method2()
wollte den Code, den Sie laufen schrieb darin. Normalerweise würde dies so funktionieren - vorausgesetzt, Sie arbeiten mit einer virtual
Methode, die Sie überschrieben haben.Da Sie jedoch eine new
/hidden-Methode verwenden, ruft sie stattdessen die Version der von Ihnen verwendeten Referenz auf.
Wenn das das Verhalten Sie wirklich wollen, dann; da gehst du. Ich würde jedoch dringend empfehlen, dass, wenn Sie das möchten, ein größeres architektonisches Problem mit dem Code auftreten könnte.
nach Googeln bin ich hier mit meinen Problemen gewesen ... – NoviceToDotNet
Sieht so aus, als müssten Sie grundlegende C# -Programmierungskonzepte lernen, bevor Sie das Überschreiben und Verbergen von Methoden verstehen können. Probieren Sie eines der vielen C# Anfängerbücher aus. – thecoop
1) a.m1(); // was wird gedruckt und warum? Einfach Es wird "hai an alle" drucken, weil Sie das Method Overriding-Konzept verwenden. 2) b = a; // was geschieht hier? Hier erhalten wir einen Kompilierungsfehler, da das Kindklassenobjekt nicht auf das Basisklassenobjekt verweist. Umgekehrt ist das Vererbungskonzept möglich. – Krish