从父类调用子类`new`方法

时间:2020-01-08 13:05:14

标签: c# inheritance overriding subclass

我有一个基类和子类,例如:

class BaseClass
{
    public void MethodA()
    {
        MethodB();
    }

    public void MethodB()
    {
        Debug.Log("BaseClass MethodB");
    }
}

class SubClass : BaseClass
{
    public new void MethodB() // <- without `new` keyword there's a warning on this line
    {
        Debug.Log("SubClass MethodB");
        base.MethodB();
    }
}

当调用BaseClass实例的MethodA时,它将调用MethodB,但仅调用BaseClass,而不首先调用SubClass。例如

var subclass = new SubClass();
subclass.MethodA(); // Does not log "SubClass MethodB" first.  Only logs "BaseClass MethodB"

如何确保父方法调用子类方法?

注意,在new行中没有MethodB关键字的情况下,Visual Studio会发出警告:'SubClass.MethodB()' hides inherited member 'BaseClass.MethodB()'. Use the new keyword if hiding was intended.

1 个答案:

答案 0 :(得分:1)

要从基类中调用Subclass.MethodB,您需要使用virtualoverride关键字。例如:

class BaseClass
{
    public void MethodA() // invoking this will correctly log "SubClass MethodB" followed by "BaseClass MethodB"
    {
        MethodB();
    }

    public virtual void MethodB()
    {
        Debug.Log("BaseClass MethodB");
    }
}

class SubClass : BaseClass
{
    public override void MethodB()
    {
        Debug.Log("SubClass MethodB");
        base.MethodB();
    }
}