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 } } |
在这种设计中,如果需要实现新的处理逻辑,则从