多重継承がオプションではない場合のコードの再利用方法
-
05-07-2019 - |
質問
以前テストしたいくつかのクラスのいくつかのメソッドを、作成中の新しいクラスに使用したいです。残念ながら、C#は多重継承をサポートしていません。これらの古いクラスのコードを再利用するにはどうすればよいですか?メンバーオブジェクトとして作成するだけですか?または他のオプションはありますか?
解決
一般的には、継承の代わりに構成を使用することが先への道です。あなたが意味する種類の具体的な例を挙げることができれば、それは適切なアプローチを見つけるのを助けるのをより簡単にするでしょう:それは常に同じではありません。
他のヒント
これらをメンバーオブジェクトとして使用するのは良い考えです。次に、目的のメソッドのみを公開し、必要に応じてそれらを調整することもできます。
同じタイプで機能する場合、拡張メソッドとして再作成できます。
public static void MyMethod( this MyType target ){}
MyType.MyMethod()
以下に示すように、MyTypeから派生したクラス、または拡張メソッドが機能するインターフェイスを実装する一般的なクラスがある場合、拡張機能はそれらに対して機能します。
public class MyDerived : MyType{}
MyDerived.MyMethod()
技術的には、C#は複数の interface 継承を実装しますが、複数ではありません 実装の継承。
複数の実装の継承の問題は、 ダイヤモンドの問題などの状況。
複数のインターフェイスを使用して、複数の実装の継承をシミュレートできます 継承と構成。これは、作成と説明したものに近い 「メンバーオブジェクトとして」再利用するオブジェクト。欲しくないもの ただし、ラップされた型から不要な動作を公開します。
以下は、多重の基本原理を示すクラス図です 合成による継承:
複数の継承http://www.freeimagehosting.net/uploads/cb219cefba.jpg
これの欠点は、インターフェイスIBreeperに変更を加える必要があることです。 対応するBreeperへの変更、およびその逆。
しかし一歩後退-あなたは慎重にその理由を調べる必要があります 古いクラスを作成します。宛先:
-
既存の動作を強化または強化します。次に、プロキシパターン;
を検討する必要があります。
-
「ワンストップショップ」を作成します。あなたのすべての行動のために。これは、 SuperFuddler が凝集性の場合(つまり、すべての公開された動作が整合している場合)のみ実行する必要があります。そうでない場合は、 God Object のメンテナンスが困難な状況。
-
SuperFuddlerの特定のクラスのクライアントに必要な使用モードとより整合性のあるインターフェースを提供します。この場合、アダプターパターンを検討する必要があります。
このように簡単に偽造できます:
public interface IFoo {
void DoFoo();
}
public class Foo : IFoo {
public void DoFoo() { Console.Write("Foo"); }
}
public class Bar {
public void DoBar() { Console.Write("Bar"); }
}
public class FooBar : IFoo, Bar {
private IFoo baseFoo = new Foo();
public void DoFoo() { baseFoo.DoFoo(); }
}
//...
FooBar fooBar = new FooBar();
fooBar.DoFoo();
fooBar.DoBar();
コンポーネントとして開発した場合、継承しないで使用する