【问题标题】:C# - calling base version of overridden methodC# - 调用覆盖方法的基本版本
【发布时间】:2023-03-08 16:06:01
【问题描述】:

假设有基类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()

标签: c# class oop derived-class


【解决方案1】:

使用方法隐藏。

方法隐藏也称为阴影。家长的方法 类可用于子类而不使用覆盖 阴影中的关键字。子类有自己的相同版本 功能。 使用 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(); }
}

【讨论】:

  • @Maras:有两件事:(1) 你可能想让Func2A 中不是虚拟的,(2) 对这种模式要格外小心。对于那些天真地期望虚拟调度获得静态调度的用户来说,这可能会非常令人困惑。
猜你喜欢
  • 2019-04-02
  • 2010-09-06
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多