gpt4 book ai didi

c# - 从父 C# 调用子方法

转载 作者:行者123 更新时间:2023-12-02 08:24:11 30 4
gpt4 key购买 nike

我的父类是:

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

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

我的 child 类(class):

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

有没有办法,当从子类调用 foo 时,将调用子类的 bar,而不是父类的 bar?

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

最佳答案

Is there any way that, when foo is called from the child class, Child's bar will be called, instead of Parent's?

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

关于c# - 从父 C# 调用子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49926078/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com