C#抽象函数可以实现吗?

时间:2011-07-22 05:23:34

标签: c# virtual abstract

有没有办法添加必须被所有继承类覆盖的虚函数?那么实际上是虚拟和抽象的结合? 我有一种情况,每个继承的类必须在执行一些通用代码之前进行一些特定的处理。虚函数不起作用,因为它们不能确保继承的类覆盖它们。并且抽象函数不能具有默认实现。目前我的解决方法是在基类中实现另一个受保护的函数,该函数包含公共/通用代码,并在重写的抽象函数中调用

3 个答案:

答案 0 :(得分:14)

不可能有一个抽象和虚拟的方法。

如果可能,您可以将方法拆分为“之前”和“之后”部分:

public void DoWork()
{
    DoBeforeWork();
    DoCommonWork();
    DoAfterWork();
}

protected abstract void DoBeforeWork();
protected abstract void DoAfterWork();

private void DoCommonWork() { ... }

否则,使用第二种受保护方法的解决方法是一个非常好的主意:

public void DoWork()
{
    DoActualWork();
}

protected abstract void DoActualWork(); // expected to call DoCommonWork

protected void DoCommonWork() { ... }

如有必要,您可以使用线程本地字段检查是否真的在DoWork中调用DoCommonWork。

但是,我可能会将该方法设为虚拟。如果派生类不想向公共部分添加任何内容,则不应该:

public virtual void DoWork() { ... }

同样,您可以检查公共部分是否真的被调用。

答案 1 :(得分:3)

我认为您可能正在寻找template method:在您的基类中实现一个方法,该方法将抽象方法作为其实现的一部分进行调用。派生类然后可以实现抽象方法,但这允许基类在执行此方法之前执行“某些特定处理”。

答案 2 :(得分:0)

我的建议是将基类拆分为两个:一个抽象类和一个具体密封类。

实施例

我假设您有基类,看起来像这样:

public class BaseClass
{
    public void DoProcessing()
    {
        // this method must be overriden in each subclass
    }
}

让我们把它分成两部分:

public abstract class BaseClass
{
    protected abstract DoProcessingImlementation();    

    public void DoProcessing()
    {
        // here you can add program logic or just call overridden implementation
        DoProcessingImplementation();
    }
}

public sealed class DefaultBaseClassImplementation : BaseClass
{
    public override DoProcessingImlementation()
    {
        // default implementation of method
    }
}

使用此设计,如果您需要实现新的处理逻辑,则从BaseClass继承新类,因为它是抽象的,您必须实现DoSomethigImplementation方法。要访问默认处理逻辑,您应该使用DefaultBaseClassImplementation类的实例。并且DefaultBaseClassImplementation被密封将不会让你从错误的类继承。