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)
我们如何得到这个输出.任何人都可以在这里解释类的铸造过程.
更新:
这如何显示阴影和覆盖之间的区别
我会假设的
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实际调用的方法都必须作为调用对象本身层次结构中的"最新"实现,而不受影响.用于引用对象的变量类型.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |