这是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
}
输出
Console.WriteLine(((A)clB).Foo()); // output 5 <<<--
Console.WriteLine(((A)clB).Bar()); // output 1
我们如何获得此输出。任何人都可以在这里解释类转换过程。
更新:
以及这如何显示阴影和替代之间的区别
最佳答案
我假设
var clB = new B();
Foo
和Bar
方法之间的区别在于,虽然Bar
使用继承和多态性来决定要调用的实现,但是Foo
方法隐藏了其原始实现。在一个词中,
A.Foo()
和B.Foo()
完全无关,它们恰好具有相同的名称。当编译器看到类型为A
的变量调用Foo
时,它将进入并执行A.Foo()
,因为该方法不是虚拟的,因此无法覆盖该方法。同样,当看到调用B
的Foo
类型的变量时,无论变量中包含的实例的实际类型如何,它都会执行B.Foo()
。另一方面,
Bar
方法被定义为虚拟方法,并且继承类可以(并且应该)重写其实现。因此,无论何时调用Bar
,无论它来自声明为A
还是B
的变量,都必须在其层次结构中找到实际调用的方法作为“最新”实现。调用对象本身,而不会影响用于引用该对象的变量的类型。