質問

以前テストしたいくつかのクラスのいくつかのメソッドを、作成中の新しいクラスに使用したいです。残念ながら、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への変更、およびその逆。

しかし一歩後退-あなたは慎重にその理由を調べる必要があります 古いクラスを作成します。宛先:

  1. 既存の動作を強化または強化します。次に、プロキシパターン;

  2. を検討する必要があります。
  3. 「ワンストップショップ」を作成します。あなたのすべての行動のために。これは、 SuperFuddler 凝集性の場合(つまり、すべての公開された動作が整合している場合)のみ実行する必要があります。そうでない場合は、 God Object のメンテナンスが困難な状況。

  4. 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();

コンポーネントとして開発した場合、継承しないで使用する

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top