2012-02-16 7 views

答えて

1

私はあなたがコンパイル時に知られていない実行時にクラスを与えられるかもしれないと考えることができる唯一の4つの方法があります。インターフェースを実装するオブジェクトのインスタンスが与えられ、そのようなインスタンスを生成したい場合があります。このシナリオでは、インターフェイスにNewSimilarInstance()メソッドが含まれていることをお勧めします。クラスには、インターフェースに制約のあるジェネリック型のパラメーターを渡すメソッドがあるかもしれません。このシナリオでは、汎用パラメーターを受け入れるルーチンはnew()制約を持つことができます。それ以外の場合は、.net System.Typeオブジェクトまたはそのタイプの他の表現(そのような文字列)を与えることができます。後者の2つのシナリオでは、コンパイル時の検証は意味をなさないでしょう。そのタイプで何かをするにはReflectionが必要なので、Reflectionを使って新しいインスタンスの作成を許可するかどうかを確認することもできます。

+0

最初の2つのシナリオの間には何かがあります。私はあなたの 'NewSimilarInstance()'の提案が私の状況では優れたものだと思います。ありがとう! –

1

いいえ、そのようなものはありません。インタフェースを使用するコードは、インタフェースを使用するコードがどのようにインスタンス化されたかを気にする必要はないという点で、少し奇妙です。つまり、実装クラスが何であるか気にする必要はなく、インタフェースを実装するだけです。

これには特別な使い方がある場合は、単体テストを書くことをお勧めします。すべての実装が同じアセンブリに含まれている場合は、かなり簡単に行う必要があります。エラーはほぼコンパイル時と同じ時刻...

5

いいえ - 指定されたインターフェイスの派生クラスまたは実装者にこのような制約を設定することはできません。

このような制約は、通常、インターフェイスで作業しているときに、一般的にそのインターフェイスを実装するオブジェクトのインスタンスを使用して作業しているので、オブジェクトは自然に既に作成されています制約は冗長です。 (当然のことながらジェネリックスを除いて、new()の制約を使用することができます)。

私はあなたが何らかのプラグインシステムを作成しようとしていて、インスタンス化に使用できるデフォルトのコンストラクタをプラグインインターフェイスの実装に拘束したいと思っています...これが正常であればMEFなど、使用できる優れた代替品です。

これを正確に必要とする理由について詳しく説明できますか?

+0

インターフェイス型パラメータ(IFooなど)を持つジェネリック型を使用したいのですが、残念ながら非常に特殊な条件でIFooオブジェクトを構築する必要があることがわかりました。 (私は知っている、これは良くない)。ジェネリック型にnew()制約を付けることはできますが、IFooにnew()がないために機能しません –

0

私はそれに仮想クラスを使う必要があると思います。

+1

抽象クラスを意味しましたか? –

+0

ええ、私の悪い。私は最近、多くのVBをやってきたし、それは私と一緒に乱れている。 – linkerro

0

Justinは、コンストラクタシグネチャをインターフェイスで制約することはできませんが、抽象クラスを使用することもできないと述べています。 あなたがそのような制約を置く必要がある理由を説明すると、問題の解決策を見つけることができます。

0

インターフェイスをインスタンス化できるファクトリをジェネリッククラスに注入し、new()制約を削除します。以下のような

何か:

public interface IFactory<out T> 
{ 
    T CreateInstance(); 
} 

public class GenericClass<T> 
{ 
    private readonly IFactory<T> _factory; 

    public GenericClass(IFactory<T> factory) 
    { 
      _factory = factory; 
    } 

    public DoSomething() 
    { 
      //... 
      T foo = _factory.CreateInstance(); 
      //... 
    } 
} 
関連する問題