class Parent
{
public int GetNo()
{
return 1;
}
}
class Child : Parent
{
public Child()
{
}
public int GetNo()
{
return 2;
}
}
Parent p = new Child();
p.GetNo();
但是它会调用Base.GetNo()
。我知道如果我在基地使用虚拟现实,它会调用Child.GetNo()
但是我不能在Base中使用virutal因为我必须从已经在DLL中分发的base派生我的类。所以我无法修改基类的现有函数。
任何建议都是有价值的。 感谢
答案 0 :(得分:6)
你可以施展它:
((Child)p).GetNo();
或
if(p is Child)
(p as Child).GetNo();
答案 1 :(得分:0)
您可以使用显式转换强制执行此操作,例如
((Child)p).GetNo();
或者您可以使用隐藏,例如
public new int GetNo()
{
return 2;
}
虽然我认为如果将变量输入到隐藏方法的类中,后者才会被调用。
如果你真的需要正确覆盖一个方法并且它来自一个已编译的DLL,请考虑与开发人员联系,看看他们是否可以使该方法成为虚拟(如果不是为什么),或者是否一个开源项目只是获取源代码代码并自行修改。
答案 2 :(得分:0)
在方法上未声明virtual
时,将始终调用基本方法,因为您将变量声明为Parent
。如果您无法将virtual
附加到基类,则只能将变量声明为Child
,或将其转换为Child
并调用GetNo
方法:
Child p = new Child();
p.GetNo();
或者:
Parent p = new Child();
((Child)p).GetNo();
答案 3 :(得分:0)
我刚刚来到这里,所以我找到了一个不使用演员阵容的解决方案,但是因为我没有找到它是一个。
也许这对某人有帮助。
abstract class Parent
{
public int GetNo()
{
return GetNoImpl();
}
protected abstract int GetNoImpl();
}
class Child : Parent
{
public Child()
{
}
protected override int GetNoImpl();
{
return 2;
}
}
Parent p = new Child();
p.GetNo();
注意:父类是抽象的。