ライブラリに抽象クラスがあります。このクラスの派生を適切に実装するのをできるだけ簡単にするようにしています。問題は、3つのステップのプロセスでオブジェクトを初期化する必要があることです。ファイルを取得し、いくつかの中間ステップを実行してから、ファイルを操作します。最初と最後のステップは、派生クラスに固有です。これは簡略化された例です。
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()
問題の核心は、スキップしても明らかなエラーが発生しないことです。特定の状況でのひどいパフォーマンス。
いずれにせよ、図書館の将来のユーザーが回避しなければならない深刻で自明ではない「落とし穴」があるように感じます。この種の初期化を実現するために使用する必要のある他の設計はありますか?
必要に応じて詳細を提供できます。私は問題を表現した最も単純な例を提供しようとしていました。