如何使用基类对象调用派生函数

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() 。 我知道如果我在base中使用Child.GetNo()它会调用Child.GetNo()但是我不能在Base中使用Child.GetNo()因为我必须从已经在DLL中分发的base派生我的类。所以我无法修改现有的基类的function。

任何建议都是有价值的。 谢谢

你可以施展它:

 ((Child)p).GetNo(); 

要么

 if(p is Child) (p as Child).GetNo(); 

您可以使用显式强制转换来强制执行此操作

 ((Child)p).GetNo(); 

或者你可以使用隐藏例如

 public new int GetNo() { return 2; } 

虽然我认为如果将变量输入到隐藏方法的类中,后者才会被调用。

如果你真的需要正确地覆盖一个方法并且它来自一个已编译的DLL,请考虑与开发人员联系,看看他们是否可以使该方法成为虚拟(如果不是为什么),或者如果一个开源项目只是获取源代码并修改它自己。

如果没有在方法上声明virtual ,则始终会调用基本方法,因为您将变量声明为Parent 。 如果你不能将virtual附加到基类,那么你只能将变量声明为Child ,或者将其GetNoChild并调用你的GetNo方法:

 Child p = new Child(); p.GetNo(); 

要么:

 Parent p = new Child(); ((Child)p).GetNo(); 

我刚刚来到这里,所以我可以找到一个不使用演员阵容的解决方案,但因为我没有找到它在这里是一个。

也许它对某人有帮助。

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

注意:父类是抽象的。