Наследование конструкторов? - PullRequest
1 голос
/ 07 февраля 2012

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

Ответы [ 4 ]

7 голосов
/ 07 февраля 2012

Это невозможно в vanilla 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 голосов
/ 07 февраля 2012

Конструкторы не наследуют так же, как методы, но у вас есть возможность вызывать конструкторы базового класса:

public DerivedClass(Foo foo) : base(foo)
2 голосов
/ 07 февраля 2012

Все остальные ответы пока верны. Однако следует понимать, что вам не нужно сопоставлять сигнатуру конструктора базового класса с определяемым вами конструктором:

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
   { ... }
}
1 голос
/ 07 февраля 2012

Вы не можете наследовать конструкторы; Вы должны вызывать их явно (за исключением конструктора по умолчанию, который вызывается, ну, по умолчанию):

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

class B : A
{
    public B (int i) : base (i) { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...