依存性注入など、インターフェイスの背後にあるクラスの具体的な実装を隠すには、関心のあるメソッドとプロパティを含むインターフェイスを抽出すると便利です。生成されたクラスでも、通常は部分クラスを作成できます。抽出されたインターフェースを実装します。
しかし、たとえば .dll から外部クラスのインターフェイスを抽出したい場合、これを行う方法が見つかりません。それは可能ですか?
通常、最も簡単な方法は、クラスをラップしてアダプター パターンを実装することです。したがって、次から始めるとします。
public class NastyExternalClass
{
public void Foo() { ... }
}
我々が追加します:
public interface IFooable
{
void Foo();
}
public sealed class NastyExternalClassWrapper : IFooable
{
private readonly NastyExternalClass original;
public NastyExternalClassWrapper(NastyExternalClass original)
{
this.original = original;
}
public void Foo()
{
original.Foo();
}
}
これは面倒です - 自動化することはできますが、R# や同様のツールが既にこれをサポートしていても驚かないでしょうが、通常は機能します。
複数のオブジェクトがお互いについて知る必要があり、元の API を使用する必要がある場合、または元の API がラッパーなどをバイパスするコールバックを追加する場合は、さらに問題になります。不完全で:(
アダプター パターンを使用して、サード パーティ ライブラリへのデリゲート呼び出しを定義した型でインターフェイスを実装できるようにしたいようです。
いいえ、自分の管理下にないクラスを変更することはできません。いくつかの代替案:
継承:基本クラスのメソッドを使用して、インターフェイスを実装するサブクラスを作成できます。
カプセル化: 外部クラスを、インターフェイスを実装するより大きなクラスの一部にし、インターフェイス メソッドを介して内部クラスに渡すことで、外部クラスを「ラップ」できます。
継承がオプションではない場合もありますが (基本クラスが の場合などsealed
)、ほとんどの場合、カプセル化が可能です。