Force方法从基类调用base方法

Eug*_*344 3 c# oop

如果我使用"override"属性创建方法,派生方法将不会自动调用基本方法实现,我将需要使用"base"关键字手动调用它,如下所示:

public class A
{
    public virtual void Say()
    {
        Console.Write("A");
    }
}

public class B : A
{
    public override void Say()
    {
        base.Say();
        Console.Write("B");
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,只有在这种情况下,字符串"A"和"B"才会写入控制台.所以问题是如何摆脱"base.Say();" 线?所以我想强制每个派生方法"Say"从基类调用base方法.可能吗?我正在寻找任何解决方案,即使我将被迫使用其他关键字

das*_*ght 9

虽然无法直接实现此目的,但您可以通过编写自己的非虚拟方法来获得相同的效果,该方法在执行某些固定操作后调用虚拟方法:

public class A
{
    public void Say()
    {
        Console.Write("A");
        SayImpl();
    }
    protected virtual void SayImpl()
    {
        // Do not write anything here:
        // for the base class the writing is done in Say()
    }
}

public class B : A
{
    protected override void SayImpl()
    {
        Console.Write("B");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在任何继承A和实现的类SayImpl()都会A在其打印输出前加上.

  • @ Eugen1344:这正是C#所支持的.现在,自动调用基类的方法也作为覆盖的一部分,这是一个不同的故事.然后你必须考虑并非所有的开发人员都希望这种行为是开箱即用的.另外,如果您希望调用基本方法在AFTER之后而不是在覆盖之前发生,该怎么办?或者在中间,或基于条件.保持明确是最好和最灵活的选择. (5认同)
  • 如果你需要这么多次,那么你有一套有趣的要求.我很少需要决定调用者如何调用基本方法.此外,有这么简单的解决方法的机智是不为它创建特殊功能的一个很好的理由.功能成本. (2认同)