【发布时间】:2013-08-12 14:51:15
【问题描述】:
我试图了解继承在 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();
}
}
Main() 的 CIL(通用中间语言)代码如下所示:
.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
CIL 中令我困扰的几行是:
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()
在animal到Dog类型的castclass之后,代码执行dog.OverRideMe();。这被翻译成 CIL 为
IL_0016: callvirt 实例无效 ConsoleApplication1.Animal::OverRideMe()
我已将 animal 对象转换为 Dog 类型。为什么要将dog.OverRideMe();翻译成CIL中的上述语句?上面代码的输出是:
此输出与基类 Animal 无关,但 CIL 仍会调用它。
【问题讨论】:
-
我不明白需要否决这个问题。至少留下评论,以便我改进它。
-
你的问题很好,坦率地说是一个很好的问题。忽略仇恨者,这些天他们在网站上失控了 IMO。
标签: c# inheritance