2012-02-06 4 views
1

Можно ли наследовать конструкторы, и если да, то как? Я пытаюсь создать класс, который наследует класс System, и я хочу его конструкторы.Наследующие конструкторы?

+1

Нет, вы можете иметь VS или R # (или другое аналогичное) расширение AutoGenerate конструктор для каждого базового конструктора, хотя. – millimoose

+0

Как бы я сделал это в VS? –

+0

Кажется, что я думал о функции Resharper. Если у вас есть это, это находится под 'Resharper> Edit> Generate Code ...'. Если нет, вам придется писать конструкторы самостоятельно, как показывает ответ Эрика. – 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 
    { ... } 
} 
Смежные вопросы