1

初期化が必要なクラスのインターフェースを抽出したいと思います。

public class Example<T>
{
    public Example(SomeData data)
    {
        // initialize self with data
    }

    public IEnumerable<T> GetObjects(SomeData data)
    {
        // extract data
    }
}

問題は、デフォルト以外の型コンストラクターを強制するインターフェイスを作成できないことです。もちろん、クラスを次のように変更できます。

public interface IExample<T>
{
    void Initilize(SomeData data);
    IEnumerable<T> GetObjects(SomeData data);
}

public class Example<T> : IExample<T>
{
    public void Initilize(SomeData data)
    {
        // initialize self with data
    }

    public IEnumerable<T> GetObjects(SomeData data)
    {
        // extract data
    }
}

しかし、これは同じではありません。インスタンス化すると、この型を直接呼び出すことができGetObjects、その結果、インスタンスが初期化されないという例外が発生するからです。

他にどのようなオプションがありますか?

4

2 に答える 2

3

これは単なるインターフェースであるため、コンストラクターを気にする必要はありません。インターフェースは、実装ができることを定義しますが、具体的にどのように実行するか、どの順序でメソッドが呼び出されるかは定義しません。

将来、別の方法で動作し、コンストラクターを必要としないインターフェイスの実装がないと、どのように現実的に言えますか?

于 2012-07-26T13:53:29.797 に答える
1

あなたはそうしない。GetObjectsコンストラクターの引数は、クラスの実装の詳細です。読み取り/書き込みプロパティを作成しない限り、インターフェイスとは関係ありません。

どこかで具体的なインスタンスを構築していて、そこにあるクラス自体についてはすでに知っているので、特定のコンストラクター引数を渡す必要があることがわかります。

「すべての IExamples はいくつかの引数を使用して構築する必要がある」というこの考えを外部で強制したい場合は、Factory パターンを使用します。

public static class ExampleFactory {
    public static IExample<T> MakeAnExample(SomeData data) {
        // return some concrete implementation... 
    }
}
于 2012-07-26T13:52:13.940 に答える