我正在使用外部类A(来自.dll文件)并想要覆盖其中一个方法:
public void Method(); // notice that I cannot add 'virtual' keyword to enable override
这是我的代码:
class B : A
{
public new void Method();
}
A obj = new B();
obj.Method(); // executes A.Method() instead of B.Method()
是否可以从A类覆盖方法方法?
注意:我不能改为B obj = new B(); (必须保持A型)
答案 0 :(得分:3)
不可能
然而,有一种解决方法。
A obj = new B();
if (obj is B) {
(obj as B).Method();
} else {
obj.Method();
}
答案 1 :(得分:1)
不,不可能覆盖该方法。
虽然您可以在B
中指定新版本:
public new void Method();
这不会覆盖该方法,因为通过基类A
的任何调用都将调度到A
中的实现,因为该方法没有虚拟插槽。编译器决定在编译时查看静态类型obj
的内容。它看到obj
是A
且Method
不是虚拟的,因此调用A
实现。
答案 2 :(得分:1)
不,不可能覆盖在基类中未声明为虚拟的方法。
正如其他答案所提到的,您可以通过声明具有相同名称的新方法来隐藏此类方法。但是这不会达到你想要的结果:通过编译时类型Method
的对象调用A
将始终运行A
方法,并通过一个对象调用编译时类型B
将始终运行B
方法。
答案 3 :(得分:0)
实际上,你通过在B类中重新声明它,隐藏你A类中的Method
。但是你在这一部分犯了错误:
A obj = new B();
因此,如果您想从B级访问Method
,则必须更改为以下表单
B obj = new B();