3

パターンが必要です:

私はC#を使用しています。

アクターが 3 人いるとします。ジム、パット、サリー。Pat の仕事は、Jim と Sally の間の契約としてインターフェイスを作成することです。サリーの仕事は、インターフェースを実装するクラスを作成することであり、ジムの仕事は、サリーのオブジェクトを使用するクラスを作成することです。

ジムは、サリーの具象オブジェクトについて知る必要はなく、それが共通インターフェースを実装していることだけを知っている必要があります。

パットは、ジムがサリーの具象オブジェクトのインスタンスを作成する方法をコントラクトに含める必要がありますが、インターフェイスとして参照されます。

インターフェイスまたは抽象クラスのいずれかに静的メソッド定義を含める方法はないため、次のようなことはできません。

public interface IFoo
{
    public static IFoo CreateIFoo();
}

インターフェイスとして参照される具象オブジェクトをジムが作成するためのメソッドをサリーが作成することを保証するために、パットはどのようにコントラクトを作成できるでしょうか?

4

2 に答える 2

1

可能であれば、Sally のインスタンスを要求します。

class Jim 
{
    public Jim(Sally sally){ /* ... */ }
}

ただし、ジムがサリーをいつ作成するかを知る必要がある場合は、デリゲートを渡すことができます。

class Jim
{
    private Func<Sally> _createSally.

    public Jim(Func<Sally> createSally)
    {
        _createSally = createSally;
    }

    public void ConsumeSally()
    {
        Sally sally = _createSally();
        /* ... */
    }
}

最も簡単な使い方:

var jim = new Jim( () => new Sally() );

コードに実際に価値を追加しない限り、sally をインスタンス化する方法を知るためにクラス (Pat) は必要ありません。いずれにせよ、ジムにパットのことを知られたくないので、パットが必要な場合は次のようにします。

var jim = new Jim( () => Pat.GetSally() );
于 2013-06-17T18:53:12.180 に答える
0

抽象ファクトリが必要なようです。に加えて、メソッドとのIFooインターフェイスIFooFactoryを作成しますCreateFoo。を実装するオブジェクトのインスタンスを Jim に与えるIFooFactoryと、Jim はそのメソッドを呼び出しますCreateFoo。を実装するオブジェクトのインスタンスを作成するのは、サリーかパットのどちらかの仕事IFooFactoryです。

于 2013-06-17T18:39:16.410 に答える