つまり、たとえば、クラス A、クラス B、クラス C があります。A、B、C にはすべてメソッド void M() がありますが、いずれもインターフェイスの実装が宣言されていません。
そのため、void M() 制約を使用してインターフェイスを指定します。しかし、クラス A、B、C はアセンブリの型です。
これらのクラスを、既にインターフェイスが実装されているかのように使用する方法はありますか。
つまり、たとえば、クラス A、クラス B、クラス C があります。A、B、C にはすべてメソッド void M() がありますが、いずれもインターフェイスの実装が宣言されていません。
そのため、void M() 制約を使用してインターフェイスを指定します。しかし、クラス A、B、C はアセンブリの型です。
これらのクラスを、既にインターフェイスが実装されているかのように使用する方法はありますか。
いいえ、それを行う方法はありません。
ただし、A、B、および C から継承し、インターフェースを実装するアダプター クラスを作成することはできます。
public class AAdapter : A, IMyInterface
{
}
いいえ、この方法で既存のクラスを変更することはできません。
新しいクラスを派生させて、それらが新しいインターフェイスを実装していると言えます。基本クラスの既存のメソッドは、インターフェイスの実装として選択されます。
interface IWithM
{
void M();
}
class MyA : A, IWithM
{
// IWithM.M will be picked from A.M
}
デコレータパターン付き。
これらのクラスの独自のバージョンを作成し、他の誰かが所有するアセンブリを変更することなく、実装を装飾することができます。
あなたのインターフェース:
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);
利点として、独自のコードで作業するときに制約を設定できるようになりました。
不利な点は、クラスのバージョンではなく、アセンブリでクラスのバージョンを使用する必要があることです。