2012-02-06 7 views
1

コンストラクタを継承することはできますか? Systemクラスを継承するクラスを作成しようとしています。そのクラスのコンストラクタが必要です。コンストラクタを継承しますか?

+1

号あなたはかかわらず、すべての基地コンストラクタのVSまたはR#(または他の同様の拡張)自動生成コンストラクタを有することができます。 – millimoose

+0

私はVSでどうすればいいのですか? –

+0

私が思っていたものはResharperの機能でした。もしあなたがそれを持っているなら、それは 'Resharper> Edit> Generate Code ... 'の下にあります。そうでない場合は、Erikの回答が示すようにコンストラクタを自分で記述する必要があります。 – millimoose

答えて

7

これはバニラC#では不可能です。コンストラクタは単純に継承することはできません。それらはすべてのレベルで再定義され、親バージョンに連鎖されなければなりません。

class Parent { 
    internal Parent(string str) { ... } 
    internal Parent(int i) { ... } 
} 

class Child : Parent { 
    internal Child(string str) : base(str) { ... } 
    internal Child(int i) : base(i) { ... } 
} 
+4

しかし、無引数コンストラクタはこのルールの例外です。他のコンストラクタがない場合、それらは自動的に定義され、基本クラスのパラメータのないコンストラクタを呼び出します。つまり、すべてのレベルでそれらを再定義する必要はありません。 – svick

4

コンストラクタは、「継承」メソッドが行うのと同じ方法ではありませんが、あなたは、基本クラスのコンストラクタを呼び出すためのオプションを持っている:

public DerivedClass(Foo foo) : base(foo) 
1

あなたはコンストラクタを継承することはできません。 (デフォルトでは、デフォルトのコンストラクタと呼ばれるデフォルトのコンストラクタを除いて)明示的に呼び出す必要があります。

class A 
{ 
    public A (int i) { } 
} 

class B : A 
{ 
    public B (int i) : base (i) { } 
} 
2

これまでのその他の回答はすべて正しいです。しかし、あなたが定義されているコンストラクタで基底クラスのコンストラクタのシグネチャと一致する必要がないことを理解する:

public class Base 
{ 
    public Base(string theString) { ... } 
} 

public class Derived:Base 
{ 
    public Derived():base("defaultValue") //perfectly valid 
    { ... } 
    public Derived(string theString) 
     :base(theString) 
    { ... } 
    public Derived(string theString, Other otherInstance) 
     :base(theString) //also perfectly valid 
    { ... } 
} 

...と親クラスのコンストラクタを呼び出すことに加えて、することもでき、「オーバーロード」のコンストラクタ内で同じ継承レベルは、thisキーワードを使用して:

public class FurtherDerived:Derived 
{ 
    public FurtherDerived(string theString, Other otherInstance) 
     :base(theString, otherInstance) 
    { ... } 

    public FurtherDerived() 
     :this("defaultValue", new Other()) //invokes the above constructor 
    { ... } 
} 
関連する問題