我在一个库中有一个抽象类。我试图使其尽可能易于正确实现该类的派生类。问题是我需要通过三个步骤来初始化对象:获取文件,执行一些中间步骤,然后处理文件。第一步和最后一步特定于派生类。以下是一个简化的示例。
abstract class Base
{
// grabs a resource file specified by the implementing class
protected abstract void InitilaizationStep1();
// performs some simple-but-subtle boilerplate stuff
private void InitilaizationStep2() { return; }
// works with the resource file
protected abstract void InitilaizationStep3();
protected Base()
{
InitilaizationStep1();
InitilaizationStep2();
InitilaizationStep3();
}
}
当然,问题在于构造函数中的虚方法调用。如果使用该类时不能确保派生类完全初始化,那么库的消费者将发现自己受到了限制。
我可以将逻辑从构造函数中提取到受保护的
Initialize()
方法中,但是实现者可能直接调用Step1()
和Step3()
而不是调用Initialize()
。问题的关键在于,如果跳过Step2()
,则不会出现明显的错误;只有在某些情况下性能非常糟糕。我觉得无论哪种方式,未来的库用户都将不得不解决一个严重而非显而易见的“陷阱”。是否有其他设计可以实现这种初始化?
如果需要,我可以提供更多细节;我只是试图提供最简单的示例来表达问题。