テスト済みの古いクラスのいくつかから、構築中の新しいクラスにいくつかのメソッドを利用したいと思います。残念ながら、C# は多重継承をサポートしていません。これらの古いクラスのコードを再利用するにはどうすればよいですか? メンバーオブジェクトとして作成するだけですか? または他に選択肢はありますか?
5 に答える
一般に、継承の代わりに構成を使用することが前進する方法です。あなたが言いたいことの具体的な例を挙げることができれば、それは適切なアプローチを見つけるのを容易にするでしょう.それは常に同じではありません.
それらをメンバー オブジェクトとして使用することをお勧めします。次に、関心のあるメソッドのみを公開し、必要に応じてそれらを調整することもできます。
同じ型で機能する場合は、拡張メソッドとして再作成できます。
public static void MyMethod( this MyType target ){}
MyType.MyMethod()
以下に示すように、MyType から派生したクラス、または拡張メソッドが機能するインターフェイスを実装するより一般的なクラスがある場合、拡張機能はそれらに対して機能します。
public class MyDerived : MyType{}
MyDerived.MyMethod()
技術的には、C# は複数のインターフェイスの継承を実装していますが、複数の 実装の継承は実装していません。
複数の実装継承の問題は、ダイヤモンドの問題のような状況につながることです。
複数のインターフェイスの継承と構成を使用して、複数の実装の継承をシミュレートできます。これは、「メンバー オブジェクトとして」再利用するオブジェクトを作成すると説明したものに近いものです。ただし、ラップされた型から不要な動作を公開することは望ましくありません。
以下は、構成による多重継承の基本原則を示すクラス図です。
複数の継承 http://www.freeimagehosting.net/uploads/cb219cefba.jpg
これの欠点は、インターフェイス IBreeper に変更を加えると、それに応じて Breeper に変更が必要になることです。
ただし、一歩下がって、古いクラスを構成する理由を注意深く検討する必要があります。それは:
既存の行動を強化または強化します。次に、プロキシ パターンを検討する必要があります。
あなたのすべての行動のための「ワンストップショップ」を作りましょう。SuperFuddlerがまとまっている (つまり、公開されているすべての動作が一致している)場合にのみ、これを実行する必要があります。
SuperFuddler の特定のクラスのクライアントが必要とする使用モードとより一貫性のあるインターフェイスを提示します。この場合、Adapter Patternを検討する必要があります。