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

Mar*_*ras 9 c# oop class derived-class

假设有基类A和派生类B

A有两个函数:fun1()fun2(),其中fun1()调用fun2()

B覆盖fun1()and fun2(),并再次fun1()调用fun2().

但是,我想调用base.fun1()overriden fun2()。由于base.fun1()调用fun2()而不是基类的版本创建了非常不幸的循环:

fun1() -> fun2() -> base.fun1() -> fun2() -> base.fun1() -> ...

有没有办法强制base.fun1()调用基本版本fun2()?我知道真正的问题可能在于这些类的糟糕设计,但我仍然很好奇是否有可能。

小智 5

使用方法隐藏。

方法隐藏也称为阴影。父类的方法对子类可用,而无需在 shadowing 中使用 override 关键字。子类有自己的相同功能版本。使用 new 关键字来执行阴影。

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(); }
}
Run Code Online (Sandbox Code Playgroud)

  • @Maras:有两件事(1)你可能想让“Func2”在“A”中不是虚拟的,(2)对此模式要格外小心。对于天真地期望虚拟调度获得静态调度的用户来说,这可能会非常令人困惑。 (4认同)