【问题标题】:Call subclass `new` method from parent [duplicate]从父类调用子类`new`方法[重复]
【发布时间】:2020-04-26 00:39:33
【问题描述】:

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

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"

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

注意,如果MethodB 行中没有 new 关键字,Visual Studio 会给出警告:'SubClass.MethodB()' hides inherited member 'BaseClass.MethodB()'. Use the new keyword if hiding was intended.

【问题讨论】:

  • 请注意此处提出了类似的问题 (stackoverflow.com/a/50184616/539490)。但它是不同的,因为这个问题是关于你什么时候不能修改基类。我希望这个问题和答案有很大不同/更简洁。如果您不同意,请投票关闭。
  • 非常类似于stackoverflow.com/questions/17717570/…。实际上有数百个类似的。我猜这个问题每周问一次略有不同。
  • 是的@PavelAnikhouski 这就是我正在寻找的答案。谢谢!我们应该投票关闭吗?
  • @AJP 你可以投票关闭或删除这个问题
  • 我不能删除它,它不会让我。已投票关闭。谢谢。

标签: c# inheritance overriding subclass


【解决方案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();
    }
}

【讨论】:

  • 你为什么回答自己的问题?
  • 完全可以发布问题并自己回答问题以进行记录......虽然在这种情况下它真的是真的基本的c#语言功能,所以我不是确定它是否有用。 “如何覆盖”就像是 C# 中子类化的第一课。
  • 正如我所说。 “为了记录”。这不是因为 OP 遇到问题并找到了解决方案,而是专门将解决方案放在 SO 上。是的,这是允许的。
  • 所以?你没有得到 xp 来回答你自己的问题。如果它可以帮助其他人并且他们支持它,那么 XP 是应得的。同样,根据规则,这是获取 XP 的合法方式。另外,我不认为拥有 17k XP 的人会真正费心去做“试图获得 XP”的事情。
  • @Nyerguds 是的,我明白你的意思,但正如你之前提到的,这是非常基本的东西,所以看起来很奇怪。
猜你喜欢
  • 2020-08-09
  • 2017-11-09
  • 2012-02-22
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多