Ich versuche zu verstehen, wie die Vererbung in C# funktioniert. Ich schrieb den folgenden Code:In Bezug auf die Vererbung C#
class Program
{
static void Main(string[] args)
{
Animal animal = new Dog();
animal.OverRideMe();
//animal.NewMethod();
Dog dog = (Dog)animal;
dog.OverRideMe();
dog.NewMethod();
Console.Read();
}
}
public abstract class Animal
{
public Animal()
{
Console.WriteLine("Base Constructor");
}
public virtual void OverRideMe()
{
Console.WriteLine("In Base Class's OverRideMe");
Console.Read();
}
}
public class Dog : Animal
{
public Dog()
{
Console.WriteLine("Derived Constructor");
}
public override void OverRideMe()
{
Console.WriteLine("In Derived Class's OverRideMe");
Console.Read();
}
public void NewMethod()
{
Console.WriteLine("In Derived Class's NewMethod");
Console.Read();
}
}
Die CIL (Common Intermediate Language) Code für den Main() wie folgt aussieht:
.method private hidebysig static
void Main (
string[] args
) cil managed
{
// Method begins at RVA 0x2050
// Code size 42 (0x2a)
.maxstack 1
.entrypoint
.locals init (
[0] class ConsoleApplication1.Animal animal,
[1] class ConsoleApplication1.Dog dog
)
IL_0000: nop
IL_0001: newobj instance void ConsoleApplication1.Dog::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void ConsoleApplication1.Animal::OverRideMe()
IL_000d: nop
IL_000e: ldloc.0
IL_000f: castclass ConsoleApplication1.Dog
IL_0014: stloc.1
IL_0015: ldloc.1
IL_0016: callvirt instance void ConsoleApplication1.Animal::OverRideMe()
IL_001b: nop
IL_001c: ldloc.1
IL_001d: callvirt instance void ConsoleApplication1.Dog::NewMethod()
IL_0022: nop
IL_0023: call int32 [mscorlib]System.Console::Read()
IL_0028: pop
IL_0029: ret
} // end of method Program::Main
Die Linien in CIL, die mich beunruhigen sind:
IL_000f: castclass ConsoleApplication1.Dog
IL_0014: stloc.1
IL_0015: ldloc.1
IL_0016: callvirt instance void ConsoleApplication1.Animal::OverRideMe()
IL_001b: nop
IL_001c: ldloc.1
IL_001d: callvirt instance void ConsoleApplication1.Dog::NewMethod()
nach dem castclass von Tiere zu Hund Typ des Codes wird ausgeführt dog.OverRideMe();. Dies wird CIL übersetzt als
IL_0016: callvirt Instanz ungültig ConsoleApplication1.Animal :: OverRideMe()
ich das Tier Objekt Hund Typ geworfen hatte. Warum sollte dog.OverRideMe(); in die obige Aussage in CIL übersetzt werden? Die Ausgabe des obigen Codes ist:
Dieser Ausgang hat nichts mit Basisklasse Tier aber CIL noch einen Anruf an, es zu tun.
Ich verstehe nicht die Notwendigkeit, diese Frage zu verwerfen. Zumindest einen Kommentar abgeben, damit ich ihn verbessern kann. – msiyer
Ihre Frage ist gut und ehrlich gesagt eine gute. Ignoriere die Hasser, sie sind auf der Seite dieser Tage IMO außer Kontrolle geraten. – jason