c#中的类转换

aga*_*yan 2 c# asp.net oop casting

这是c#代码

class A {
   public int Foo(){ return 5;}
   public virtual int Bar(){return 5;}
}
class B : A{
   public new int Foo() { return 1;}     //shadow
   public override int Bar() {return 1;} //override
}
Run Code Online (Sandbox Code Playgroud)

输出

Console.WriteLine(((A)clB).Foo()); // output 5 <<<--
Console.WriteLine(((A)clB).Bar()); // output 1
Run Code Online (Sandbox Code Playgroud)

我们如何得到这个输出.任何人都可以在这里解释类的铸造过程.

更新:

这如何显示阴影和覆盖之间的区别

SWe*_*eko 6

我会假设的

var clB = new B();
Run Code Online (Sandbox Code Playgroud)

Foo和Bar方法之间的区别在于,虽然Bar使用继承和多态来决定要调用的实现,但该Foo方法隐藏了它的原始实现.

在一个词中,A.Foo()并且B.Foo()完全不相关,它们碰巧具有相同的名称.当编译器看到一个类型的变量A调用Foo它进入并执行时A.Foo(),因为该方法不是虚拟的,所以它不能被覆盖.类似地,当它看到B调用Foo它的类型的变量执行时B.Foo(),无论变量中包含的实例的实际类型如何.

另一方面,该Bar方法被定义为虚拟,并且继承类可以(并且期望)覆盖它的实现.因此,无论何时进行调用Bar,无论它是来自声明为A或的变量,B实际调用的方法都必须作为调用对象本身层次结构中的"最新"实现,而不受影响.用于引用对象的变量类型.