我在图书馆中有一个抽象类。我试图尽可能简单地正确实现这个类的派生。问题是我需要在一个三步过程中初始化对象:获取一个文件,执行几个中间步骤,然后使用该文件。第一步和最后一步是派生类特有的。这是一个精简的示例。
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()
andStep3()
而不是调用Initialize()
. 问题的症结在于如果Step2()
被跳过不会有明显的错误;在某些情况下只是糟糕的表现。
我觉得无论哪种方式,图书馆的未来用户都必须解决一个严重且不明显的“陷阱”。我应该使用其他一些设计来实现这种初始化吗?
如有必要,我可以提供更多详细信息;我只是想提供一个表达问题的最简单的例子。