我的父类是:
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上做了其他的事情,我不想复制整个方法只改变那一行。
答案 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();
}
}