私は、階層的に編成された一連のクラスを持つサードパーティのアセンブリを使用しています。CreateXxx()
これらにはプライベート コンストラクターがあり、1 レベル上の別のクラスのインスタンスでメソッドを呼び出すことによってインスタンス化されます。階層の最上位では、シングルトン クラスが使用されます。たとえば、アプリケーション コードは次のようになります。
TopClass top = TopClass.GetInstance();
SecondLevelClass secondLevel = top.CreateSecondLevelElement();
ThirdLevelClass thirdLevel = secondLevel.CreateThirdLevelElement();
同様に、ファイナライズはDeleteXxx()
メソッドを使用して行われます。これは、 に使用される同じオブジェクトで発生する必要がありますCreateXxx()
。
この特定のアプローチが採用された理由については説明しません。ただし、これらのクラスの作成を、パブリック コンストラクターを持つ独自のクラス セットでカプセル化して、次のようにコードの見栄えを良くしたいと考えています。
// No TopClass anymore, see explanation below
MySecondLevelClass secondLevel = new MySecondLevelClass();
MyThirdLevelClass thirdLevel = new MyThirdLevelClass(secondLevel);
私の最初のアプローチは、MyXxx
クラスがCreateXxx()
コンストラクターで関連するメソッドを呼び出し、結果への参照を維持することでした。DeleteXxx()
また、ファイナライズ時にメソッドを呼び出すには、コンストラクター パラメーターへの参照が必要です。そのためには、内部で実装IDisposable
して呼び出すことを考えていました。DeleteXxx()
Dispose()
このアプローチではTopClass
、SecondLevelClass インスタンスの作成と破棄が唯一の目的であるため、アプリケーション開発者にとって は不要になりました。これは、MySecondLevelClass
コンストラクター内のボンネットの下で発生するようになりました。
全体として、これは技術的に健全だと思います。MyXxx
私が遭遇する唯一の問題は、元のクラスが多くのメソッドを持つインターフェイスを実装しているという事実です。これは、まだクラスを介して公開したいと考えています。私は自分のクラスでこれらすべてのメソッドを再定義することを楽しみにしていません。すべての呼び出しを「元の」クラスのインスタンスへのカプセル化された参照に転送するだけです。ドット演算子をオーバーロードするようなことができればいいのですが。または、元のクラスのインスタンスへのカプセル化された参照が実際にインターフェイスを実装していることをコンパイラに伝えるとよいでしょう。つまり、VMT に特別な間接化を追加するようなものです。
もちろん、これらのオプションはサポートされておらず、すべてのメソッドのこの重複を回避する方法は見つかりませんでした。よりスマートな方法でこれを行う方法を知っている人はいますか? 事前に感謝します。