2011-12-26 2 views
8

一般的な工場パターンのような仕組みを作りようとしています。子孫にパラメータのないコンストラクタを強制することはできますか?

工場は次のようになります:

public class APlugin<ActionType> where ActionType : IAction 
{ 
    // create a new action. Note: ActionType should contain 
    // an empty constructor 
    public ActionType CreateAction() 
    { 
     return Activator.CreateInstance<ActionType>(); 
    } 
} 

IActionの子孫は、パラメータなしのコンストラクタを隠す可能性があり、これは、工場が失敗します。

+0

あなただけのコンストラクタ、新しいACTIONTYPEを(使用できるように、それを新しい()制約を与えます)。ただし、プラグインのシナリオでは必ずしも有用ではありません。 –

+1

"空のコンストラクタ"と言うと、パラメータを持たないコンストラクタを意味しますか? – Gabe

+0

はい@Gabe。正確には – Odys

答えて

8

派生型に空のコンストラクタまたは任意のタイプのコンストラクタを強制することはできません。

コンストラクタは継承されませんが、呼び出されます。

: base()構文を使用して)ベースコンストラクタに連結しない場合、デフォルトのベースコンストラクタは暗黙的に呼び出されます。 MSDNのUsing Constructorsから

:派生クラスで

、基底クラスのコンストラクタを明示的にベースキーワードを使用して呼び出されていない場合は、デフォルトのコンストラクタ、存在する場合、暗黙的に呼び出されます。

9

ジェネリック制約where T : new()を指定することで、クラスに引数のないコンストラクタがあることを保証できます。ただし、タイプTのみに影響します。クラスを含むクラスは影響を受けませんので、ケース内のActionTypeがコンストラクタを指定していることを確認できますが、APlugin<T>から継承しているどのクラスにも適用することはできません。

+0

'new()'ジェネリック型の制約は、パブリックなパラメータのないコンストラクタが必要であることを単に意味します。制約付きの型(または派生型)にパラメータを持つコンストラクタが存在することはありません。 – Oded

+2

私は 'new()'が何をするのか知っていますが、私はOPが何を達成しようとしているのかよくわかりません。パラメータなしのコンストラクタがないので、 'Activator.CreateInstance ()'が失敗しないようにしたいと思うようです。 'ActionType'に制約を加えることでそれが処理されます。パラメータのないコンストラクタもあれば、パラメータを持つコンストラクタを追加することはできません。 – MagnatLU

+0

(続き)デフォルトのコンストラクタを持たないIActionから実装する型があるかもしれませんが、 'APlugin'のジェネリック型' ActionType'として使用しようとするとコンパイラエラーが発生します。 – MagnatLU

0

かなり遅くしかし、私は、これは知って価値があると思います。..

あなたは非抽象クラスの0パラメータを持つコンストラクタを強制することができます。これは、クラス構造に対してこれらの制約を適用したいときはいつでも使用する型制約です。それはあなたが妨害しているかもしれないインタフェースを実装するタイプを指定することを必要とします。それはあなたがきちんとした型の安全をしたいならば値段です。

public interface IEmptyConstructor<TThis> where TThis : IEmptyConstructor<TThis>, new() {} 
例えば

シングルトン構造

public abstract class Singleton<TThis> : ISingleton where TThis : Singleton<TThis>, new() { /* some singleton madness */ } 
関連する問題