1

つまり、たとえば、クラス A、クラス B、クラス C があります。A、B、C にはすべてメソッド void M() がありますが、いずれもインターフェイスの実装が宣言されていません。

そのため、void M() 制約を使用してインターフェイスを指定します。しかし、クラス A、B、C はアセンブリの型です。

これらのクラスを、既にインターフェイスが実装されているかのように使用する方法はありますか。

4

3 に答える 3

1

いいえ、それを行う方法はありません。

ただし、A、B、および C から継承し、インターフェースを実装するアダプター クラスを作成することはできます。

public class AAdapter : A, IMyInterface
{
}
于 2013-02-16T03:00:17.617 に答える
1

いいえ、この方法で既存のクラスを変更することはできません。

新しいクラスを派生させて、それらが新しいインターフェイスを実装していると言えます。基本クラスの既存のメソッドは、インターフェイスの実装として選択されます。

interface IWithM
{
  void M();
}

class MyA : A, IWithM
{
  // IWithM.M will be picked from A.M
}
于 2013-02-16T03:00:48.740 に答える
1

デコレータパターン付き。

これらのクラスの独自のバージョンを作成し、他の誰かが所有するアセンブリを変更することなく、実装を装飾することができます。

あなたのインターフェース:

public interface IImplementsM()
{
  void M();
}

public class MyA : IImplementsM 
{
   private A _a;

   public MyA(A a){
     _a = a;
   }

   public void M(){
     _a.M();
   }

}

次に、使用する代わりにコードでA独自のバージョンまたはインターフェイスを使用できます。

// some other class

public void DoSomething(IImplementsM implementsM)
{
 implementsM.M();
}

実行するには、次のようになります。

 var myA = new MyA(new A());
 DoSomething(myA);

利点として、独自のコードで作業するときに制約を設定できるようになりました。

不利な点は、クラスのバージョンではなく、アセンブリでクラスのバージョンを使用する必要があることです。

于 2013-02-16T03:03:37.957 に答える