这是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();


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

在一个词中,A.Foo()B.Foo()完全无关,它们恰好具有相同的名称。当编译器看到类型为A的变量调用Foo时,它将进入并执行A.Foo(),因为该方法不是虚拟的,因此无法覆盖该方法。同样,当看到调用BFoo类型的变量时,无论变量中包含的实例的实际类型如何,它都会执行B.Foo()

另一方面,Bar方法被定义为虚拟方法,并且继承类可以(并且应该)重写其实现。因此,无论何时调用Bar,无论它来自声明为A还是B的变量,都必须在其层次结构中找到实际调用的方法作为“最新”实现。调用对象本身,而不会影响用于引用该对象的变量的类型。

10-08 08:55
查看更多