5

依存性注入など、インターフェイスの背後にあるクラスの具体的な実装を隠すには、関心のあるメソッドとプロパティを含むインターフェイスを抽出すると便利です。生成されたクラスでも、通常は部分クラスを作成できます。抽出されたインターフェースを実装します。

しかし、たとえば .dll から外部クラスのインターフェイスを抽出したい場合、これを行う方法が見つかりません。それは可能ですか?

4

3 に答える 3

15

通常、最も簡単な方法は、クラスをラップしてアダプター パターンを実装することです。したがって、次から始めるとします。

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 がラッパーなどをバイパスするコールバックを追加する場合は、さらに問題になります。不完全で:(

于 2013-07-09T12:53:49.363 に答える
1

アダプター パターンを使用して、サード パーティ ライブラリへのデリゲート呼び出しを定義した型でインターフェイスを実装できるようにしたいようです。

于 2013-07-09T12:54:48.243 に答える
1

いいえ、自分の管理下にないクラスを変更することはできません。いくつかの代替案:

継承:基本クラスのメソッドを使用して、インターフェイスを実装するサブクラスを作成できます

カプセル化: 外部クラスを、インターフェイスを実装するより大きなクラスの一部にし、インターフェイス メソッドを介して内部クラスに渡すことで、外部クラスを「ラップ」できます。

継承がオプションではない場合もありますが (基本クラスが の場合などsealed)、ほとんどの場合、カプセル化が可能です。

于 2013-07-09T12:56:54.310 に答える