【问题标题】:Call child method from parent c#从父 c# 调用子方法
【发布时间】:2018-04-19 16:36:21
【问题描述】:

我的父类是:

public Class Parent
{
    protected void foo()
    {
        bar();
    }

    protected void bar()
    {
        thing_a();
    }
}

我的孩子班:

public class Child : Parent
{
    protected void bar()
    {
        thing_b();
    }
}

有没有什么办法,当从子类调用 foo 时,会调用 Child 的 bar 而不是 Parent 的?

一些上下文,尽管我怀疑它是否重要: “foo”是 Unity 的 FixedUpdate,“bar”只是我需要为孩子更改的一些功能,但由于我在 FixedUpdate 上做了其他事情,我不想复制整个方法只是为了更改那一行。

【问题讨论】:

  • 查找virtualabstractoverride。你需要一个基本的 c# 教程
  • 使 foo 成为虚拟,您的父类抽象和/或将委托传递给另一个类中的方法,例如模板模式,并让该方法执行并处理不同的条件委托。

标签: c# oop


【解决方案1】:

有没有什么办法,当从子类调用 foo 时,会调用 Child 的 bar 而不是 Parent 的?

是的,但与 Java 不同,该功能在 C# 中默认关闭。

在 C# 中,您可以这样打开它:

public class Base
{
  protected void foo()
  {
    bar();
  }
  protected virtual void bar()
  {
    thing_a();
  }
}
public class Derived : Base
{
  protected override void bar()
  {
    thing_b();
  }
}

我注意到你应该得到一个编译器警告,解释这个程序看起来不对。您是否忽略了警告? 停止忽略编译器警告;他们会通知您可能出现的错误。

如果您打算拥有两个同名但相互覆盖的方法,那么首先解释为什么会这样,因为那是想要一件奇怪的事情,几乎可以肯定是错的。其次,你用new向编译器表明:

public class Base
{
  protected void foo()
  {
    bar();
  }
  protected void bar()
  {
    thing_a();
  }
}
public class Derived : Base
{
  protected new void bar()
  {
    thing_b();
  }
}

最后,一个常见的模式是让覆盖方法调用被覆盖的方法。你可以这样做:

public class Base
{
  protected void foo()
  {
    bar();
  }
  protected virtual void bar()
  {
    thing_a();
  }
}
public class Derived : Base
{
  protected override void bar()
  {
    thing_b();
    base.bar();
  }
}

现在从foo 调用this.bar 将调用thing_b(),然后调用thing_a()

【讨论】:

  • "您是否忽略了警告?"鉴于 OP 提到了 Unity,并且在 Unity 的编辑器中显示警告的地方并不是很有创意,我不会对此感到惊讶
  • 没有收到任何警告,可能是因为我使用的是 Unity。无论如何,它现在可以工作了,谢谢。
  • @e2298:弄清楚如何打开编译器警告。他们随时为您提供帮助。
【解决方案2】:

首先,您需要将访问修饰符从私有修改为公共或受保护。然后你需要在父方法上添加 virtual 关键字,在子方法上添加 override 关键字。

public class Parent
{
    public void foo()
    {
        bar();
    }

    public virtual void bar()
    {
        thing_a();
    }
}

public class Child : Parent
{
    public override void bar()
    {
        thing_b();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多