从父c调用子方法#

时间:2018-04-19 16:36:21

标签: c# oop

我的父类是:

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

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

我的孩子班:

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

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

有些背景,但我怀疑这很重要: “foo”是Unity的FixedUpdate,“bar”只是我需要为孩子们​​改变的一些功能,但由于我在FixedUpdate上做了其他的事情,我不想复制整个方法只改变那一行。

2 个答案:

答案 0 :(得分:9)

  

有没有办法,当从子课程调用foo时,会调用Child的栏,而不是父亲的?

是的,但与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();
  }
}

现在,来自this.bar的{​​{1}}来电将foo,然后thing_b()

答案 1 :(得分:4)

首先,您需要将访问修饰符从私有修复为公共或受保护。然后,您需要在父方法上添加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();
    }
}