Конструктор многоуровневого наследования в C#

#c# #inheritance #constructor

#c# #наследование #конструктор

Вопрос:

Есть ли в C # способ вызвать конструктор дедушки? Допустим, у меня есть:

 public class A
{
   public A(parameterX x)
   {
      doSomething();
   }
}

public class B : A
{
   public B(parameterX x) : base(x)
   {
      doSomethingElse();
   }
}
  

И тогда у меня есть:

 public class C : B
{
}
  

И я хочу, чтобы конструктор в C вызывал конструктор в A, что я могу для этого использовать?
Есть ли что-то вроде:

 public C(parameterX x) : base : base(x)
  

Или как я могу просто вызвать конструктор в A из C?

Спасибо.

Комментарии:

1. Почему бы конструктору B не вызвать A, чтобы при вызове C вызывался A .

Ответ №1:

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

Когда вы пишете public C(parameterX x) : base(x) , он будет вызывать B(x) , который, в свою очередь, вызовет A(x) .

В общем, поскольку конструктор вашего базового класса всегда будет вызывать свой базовый конструктор (ваш прародитель), не имеет смысла иметь возможность явно вызывать конструктор прародителя, поскольку это приведет к его созданию дважды.

Комментарии:

1. Я знаю, но проблема немного сложнее, чем то, что я написал здесь, конструктор B принимает параметр из класса foo, а конструктор C принимает параметр из класса bar . Foo и bar разные, но оба имеют класс D в качестве родительского. Затем конструктор класса A принимает параметр любого из них, поскольку он использует шаблоны. Итак, я не могу пройти через B, но A будет нормально работать с моим параметром.

2. Нет. Вы всегда должны вызывать (прямой) конструктор базового класса. У вас не может быть сконструированного класса. Рассмотрите возможность добавления protected конструктора в B . Кроме того, это звучит как плохой дизайн; подумайте о его рефакторинге.

3. Я мог бы добавить защищенный конструктор, дизайн не самый лучший, я пытаюсь интегрироваться в существующую среду с помощью своего рода взлома, который сэкономит мне кучу работы. Спасибо!

Ответ №2:

Хотя я не совсем понимаю, что вы пытаетесь сделать, и вы, вероятно, можете придумать лучший фактический дизайн, вы, вероятно, можете достичь того, что вам нужно, добавив другой конструктор в B, который принимает параметр Bar как A, но ничего не делает в нем, просто вызывая конструктор (Bar),таким образом, когда вы выполняете C (bar) : base (bar), он перейдет к B, а затем к A. Уродливый, как ад.

Комментарии:

1. Я мог бы сделать это, я знаю, что это плохой дизайн, просто пытаюсь сэкономить мне кучу работы на данный момент.