#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. Я мог бы сделать это, я знаю, что это плохой дизайн, просто пытаюсь сэкономить мне кучу работы на данный момент.