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