インターフェイスを実装しているすべてのクラスに空のコンストラクタなどの制約を設定することは可能ですか?ジェネリックのwhere T : new()
のような制約?インターフェイスを実装するクラスのコンストラクタを制約することはできますか?
答えて
私はあなたがコンパイル時に知られていない実行時にクラスを与えられるかもしれないと考えることができる唯一の4つの方法があります。インターフェースを実装するオブジェクトのインスタンスが与えられ、そのようなインスタンスを生成したい場合があります。このシナリオでは、インターフェイスにNewSimilarInstance()
メソッドが含まれていることをお勧めします。クラスには、インターフェースに制約のあるジェネリック型のパラメーターを渡すメソッドがあるかもしれません。このシナリオでは、汎用パラメーターを受け入れるルーチンはnew()
制約を持つことができます。それ以外の場合は、.net System.Type
オブジェクトまたはそのタイプの他の表現(そのような文字列)を与えることができます。後者の2つのシナリオでは、コンパイル時の検証は意味をなさないでしょう。そのタイプで何かをするにはReflectionが必要なので、Reflectionを使って新しいインスタンスの作成を許可するかどうかを確認することもできます。
最初の2つのシナリオの間には何かがあります。私はあなたの 'NewSimilarInstance()'の提案が私の状況では優れたものだと思います。ありがとう! –
いいえ、そのようなものはありません。インタフェースを使用するコードは、インタフェースを使用するコードがどのようにインスタンス化されたかを気にする必要はないという点で、少し奇妙です。つまり、実装クラスが何であるか気にする必要はなく、インタフェースを実装するだけです。
これには特別な使い方がある場合は、単体テストを書くことをお勧めします。すべての実装が同じアセンブリに含まれている場合は、かなり簡単に行う必要があります。エラーはほぼコンパイル時と同じ時刻...
いいえ - 指定されたインターフェイスの派生クラスまたは実装者にこのような制約を設定することはできません。
このような制約は、通常、インターフェイスで作業しているときに、一般的にそのインターフェイスを実装するオブジェクトのインスタンスを使用して作業しているので、オブジェクトは自然に既に作成されています制約は冗長です。 (当然のことながらジェネリックスを除いて、new()
の制約を使用することができます)。
私はあなたが何らかのプラグインシステムを作成しようとしていて、インスタンス化に使用できるデフォルトのコンストラクタをプラグインインターフェイスの実装に拘束したいと思っています...これが正常であればMEFなど、使用できる優れた代替品です。
これを正確に必要とする理由について詳しく説明できますか?
インターフェイス型パラメータ(IFooなど)を持つジェネリック型を使用したいのですが、残念ながら非常に特殊な条件でIFooオブジェクトを構築する必要があることがわかりました。 (私は知っている、これは良くない)。ジェネリック型にnew()制約を付けることはできますが、IFooにnew()がないために機能しません –
Justinは、コンストラクタシグネチャをインターフェイスで制約することはできませんが、抽象クラスを使用することもできないと述べています。 あなたがそのような制約を置く必要がある理由を説明すると、問題の解決策を見つけることができます。
インターフェイスをインスタンス化できるファクトリをジェネリッククラスに注入し、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();
//...
}
}
- 1. クラスはクラスを拡張してインターフェイスを実装できます
- 2. 複数のインターフェイスを実装するすべてのクラスを置き換えることは可能ですか?
- 3. IEnumerableまたは配列をエンベロープする制約、インターフェイス、クラスはありますか?
- 4. インターフェイスを実装するすべてのクラスを取得できますか?
- 5. c#app:JSONインターフェイスを実装することは可能ですか?
- 6. Linq2Sqlクラスにインターフェイスを実装できますか?
- 7. タイプパラメータの制約:インターフェイスと抽象クラス
- 8. .NET(基本クラスとインターフェイスの制約)で型パラメータの制約がある点
- 9. CodeRushでインターフェイスを実装するクラスを取得するには?
- 10. インターフェイスメソッド戻り値の型は、インターフェイスを実装するクラスです。
- 11. クラスのインターフェイスを実装するタイミングとインターフェイスの匿名実装をインスタンス化するタイミング
- 12. クラスが多くのインターフェイスを実装していることをどのようにテストできますか?
- 13. 制約は特別なクラス 'System.Object'にすることはできません
- 14. Runnableインターフェイスを実装するクラスのオブジェクトを作成できません
- 15. インターフェイスを実装するプログラマを強制する方法
- 16. リスナーを表すインターフェイスのメソッドにデフォルトの実装を追加することはできますか?
- 17. 値コンストラクタのクラス制約の指定
- 18. MySQLのVARCHARカラムの制約を設定することはできますか?
- 19. パラメータを2つのインターフェイスに実装することは可能ですか?
- 20. マネージC++でインターフェイスを実装する方法は?ここ
- 21. 実装クラスは実装されたインターフェイスからXMLコメントを「継承できますか?
- 22. CoClassAttributeを使用して(ab)インターフェイスのデフォルトの実装を提供することはできますか?
- 23. 汎用インターフェイスを実装するC#クラスを宣言する
- 24. Rのnnlsで追加の制約を実装する
- 25. XmlResourceParser:inferfaceはインターフェイスを実装しますか?
- 26. クラスでは、私がここでIteratorインターフェイス を実装に問題がある
- 27. インターフェイスを実装するメリット
- 28. できないことは、型制約でジェネリックメソッドをオーバーロードする
- 29. TypeScriptモジュールがインターフェイスを実装または遵守できないのはなぜですか?私はこれを回避することはできますか?
- 30. .NETでDynamicTypeを作成するインターフェイスを実装するが、基本クラスのメンバ実装を使用する
いいえ、コンストラクタをインターフェイスで制約することはできません。 – dasblinkenlight