关于虚拟:C#抽象函数可以实现吗?

C# Abstract function with implementation possible?

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


不可能同时拥有抽象和虚拟的方法。

如果可能,可以将方法拆分为"before"和"after"部分:

1
2
3
4
5
6
7
8
9
10
11
public void DoWork()
{
    DoBeforeWork();
    DoCommonWork();
    DoAfterWork();
}

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

private void DoCommonWork() { ... }

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

1
2
3
4
5
6
7
8
public void DoWork()
{
    DoActualWork();
}

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

protected void DoCommonWork() { ... }

如果需要,可以使用线程本地字段检查DoWork中是否真的调用了DocommonWork。

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

1
public virtual void DoWork() { ... }

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


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


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

例子

我假设您有这样的基类:

1
2
3
4
5
6
7
public class BaseClass
{
    public void DoProcessing()
    {
        // this method must be overriden in each subclass
    }
}

我们把它分成两部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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类的一个实例。以东王一〔二〕封了,你就不能从错误的阶级承受。