3

多くの場所で使用されている次のパターンを見てきました。

abstract class SimpleProvider<T> 
{
    public object Create(IContext context) 
    {
        return CreateInstance(context);
    }

    protected abstract T CreateInstance(IContext context);
}

実際の違いがわかりません。なぜ次のように書かれていないのでしょうか。

abstract class SimpleProvider<T> 
{
    public abstract T Create(IContext context);
}

更新:上記のスニペットNinjectは、インターフェイスが指定されていない場所のドキュメントから取得しましたが、実際のソースを見ると、サブコールの必要性を説明し、私の質問に答えるSimpleProvider<T>インターフェイスを実装していることがわかります。IProvider

4

5 に答える 5

2

したがって、唯一の違いは戻り値の型 (T ではなく Object) です。これは、呼び出し元がキャストを必要とすることを意味します。

私がこれを行うと考えることができる唯一の理由は、それらが実装されたインターフェースを持っていた場合です。object Create(IContext context);

于 2011-06-03T10:18:57.850 に答える
2

これは、T 型のオブジェクトを作成することを保証することでプロバイダーにコンパイル時の型の安全性を提供しますが、クラスがオブジェクトのみで動作するより一般的なコードとインターフェイスできるようにします。

これは、コントロール コンテナーの反転で使用されるファクトリ オブジェクトを操作する場合によく発生します。

于 2011-06-03T10:22:33.893 に答える
1

私が見る唯一の使用法は、 SimpleProvider が method とのインターフェースを実装する場合Create(IContext context)です。次に、場合によっては非常に重要な T の正確な型を知る必要のないクラスから使用できます。

于 2011-06-03T10:20:38.767 に答える
0

あなたが言っていることがすべて真実である場合、実際的な違いはありません。無料のタイプセーフメソッドを取得するだけです =)

于 2011-06-03T10:13:53.933 に答える
0

これにより、呼び出し元がコンパイル時に T を知る必要がなくなります。また、パブリック メソッドが特定のサブクラスの実装から切り離されているため、クラス階層全体でインターフェイスの一貫性が保たれます。

于 2011-06-03T11:02:00.750 に答える