C# 强制方法从基类调用基类方法

C# 强制方法从基类调用基类方法,c#,oop,C#,Oop,如果我正在创建具有“override”属性的方法,派生方法将不会自动调用基本方法实现,我需要使用“base”关键字手动调用它,如下所示: public class A { public virtual void Say() { Console.Write("A"); } } public class B : A { public override void Say() { base.Say(); Conso

如果我正在创建具有“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");
    }
}

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

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

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");
    }
}

现在,从
A
继承并实现
SayImpl()
的任何类都将在其打印输出前添加
A

谢谢!但我很好奇为什么c#开发人员没有添加功能来用实现覆盖mathod?这是非常好的功能,我需要它很多times@Eugen1344:这正是C所支持的。现在,自动调用基类的方法也是重写的一部分,这是另一回事。然后,你必须考虑到并非所有的开发人员都想要这种行为。另外,如果希望对基方法的调用发生在重写之后而不是之前,该怎么办。或者在中间,或者基于一个条件。保持它的明确性是最好和最灵活的选择。如果您多次需要它,那么您有一组有趣的需求。我很少需要指示调用方如何调用基本方法。此外,有这样一个简单的解决方法,这也是不为其创建特殊功能的一个很好的理由。功能要花钱。@Eric这取决于设计。我没有为了模仿帖子的层次结构而将其抽象化,但总的来说,我更喜欢将所有非叶类
抽象
(以及所有叶类
密封
)。@sstan我认为创建新关键字是可能的。例如“扩展”。因此,您将编写“public extended void Say()”,以使此方法从基类扩展此方法这有X-Y问题的味道;关于未定义问题的建议解决方案的问题。什么是真正的业务需求导致您进行此查询?简短的回答是:不。您描述它的方式不可能。我一般是问这个问题,因为我有很多情况下需要使用此功能