C# - 调用被覆盖方法的基本版本

9
假设有一个基类 A 和派生类 B
A 有两个函数:fun1()fun2(),其中 fun1() 调用 fun2()
B 覆盖了 fun1()fun2(),并且再次在 fun1() 中调用了 fun2()
然而,我想在重写的 fun2() 中调用 base.fun1()。由于 base.fun1() 调用了 fun2() 而不是基类版本,这就创建了一个非常不幸的循环: fun1() -> fun2() -> base.fun1() -> fun2() -> base.fun1() -> ... 有没有办法强制 base.fun1() 调用 fun2() 的基本版本?我知道真正的问题可能在于这些类的设计不好,但我仍然很好奇是否有可能。

这些函数除了互相调用之外,还有一些不太重要的不同操作。我并不是在寻求非常具体的代码帮助,因为它可能可以用更好的方式重写。在这个例子中,我会这样看待它:fun1() -> fun2() -> base.fun1() -> base.fun2()。不幸的是,在覆盖 base.fun2() 后,base.fun1() 调用了 fun2() - Maras
1个回答

5

使用方法隐藏。

方法隐藏也被称为 shadowing。在 shadowing 中,子类不需要使用 override 关键词即可访问父类的方法。子类拥有自己版本的相同功能的方法。 使用 new 关键字来执行 shadowing。

public class A
{
    public virtual void Func1() { Func2(); }

    public virtual void Func2() { Console.WriteLine("A: Func2"); }
}

public class B : A
{
    public override void Func1() { Func2(); }

    public new void Func2() { base.Func1(); }
}

4
@Maras:有两件事情(1)你可能希望在A中将Func2改为非虚函数,(2)在使用这种模式时要格外小心。对于那些天真地期望虚分派和静态分派混用的用户来说,它可能会非常令人困惑。 - Eric Lippert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接