C#是否可以覆盖此方法?

时间:2014-01-03 13:34:26

标签: c# polymorphism override

我正在使用外部类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型)

4 个答案:

答案 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的内容。它看到objAMethod不是虚拟的,因此调用A实现。

答案 2 :(得分:1)

不,不可能覆盖在基类中未声明为虚拟的方法。

正如其他答案所提到的,您可以通过声明具有相同名称的新方法来隐藏此类方法。但是这不会达到你想要的结果:通过编译时类型Method的对象调用A将始终运行A方法,并通过一个对象调用编译时类型B将始终运行B方法。

答案 3 :(得分:0)

实际上,你通过在B类中重新声明它,隐藏你A类中的Method。但是你在这一部分犯了错误:

A obj = new B();

因此,如果您想从B级访问Method,则必须更改为以下表单

B obj = new B();