#c_sharp #c_sharp_faq
public class BaseClass { public int X; public BaseClass() { X = 1; } } public class Subclass : BaseClass { public Subclass() { Console.WriteLine(X); } //1 } Код взят из учебника и мне непонятно, почему конструктор базового класса тоже вызывается. Ведь мы не вызываем его через ":base"
Ответы
Ответ 1
Базовый конструктор по умолчанию вызывается всегда, если он присутствует в базовом классе*. Стоит помнить, что конструктор по умолчанию генерируется всегда, если отсутствуют другие конструкторы. Явный вызов базового конструктора через ключевое слово base нужен в том случае, когда у вас есть один или несколько конструкторов с параметрами, и вам нужно/вы хотите пробросить все или часть этих параметров в базовый класс, указав при этом конкретный конструктор базового класса: public class BaseClass { public BaseClass(string someParam) { ... } } public class ChildClass: BaseClass { public ChildClass(string someParam, int someParam2) : base(someParam) { ... } } Вы также можете использовать его и в вашем случае, однако в этом нет нужды и компилятор это подскажет: public class BaseClass { public int X; public BaseClass() { X = 1; } } public class Subclass : BaseClass { public Subclass() : base() { Console.WriteLine(X); } } *существуют исключения: например, когда конструктор по умолчанию наследника вызывает конструктор с параметрами базового класса, используя base()Ответ 2
При создании экземпляра класса наследника всегда вызывается конструктор базового класса. ключевое слово base позволяет указать какой именно конструктор базового класса будет вызван. При отсутствии указания, компилятор будет пытаться вызывать из базового класса конструктор без параметров, и если в базовом классе такой конструктор будет отсутствовать, то будет ошибка, о том, что базовый тип не содержит конструктора без параметров. using System; class B { public B(int i) {Console.WriteLine("Base non-default constructor");} } class D : B { public D(int i) {} // error CS1729: The type `B' does not contain a constructor that takes `0' arguments } public class Test { public static void Main() { new D(42); } }
Комментариев нет:
Отправить комментарий