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

时间:2011-08-18 07:25:42

标签: c# inheritance

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派生我的类。所以我无法修改基类的现有函数。

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

4 个答案:

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

注意:父类是抽象的。

相关问题