Порядок инициализации при создании наследника
Вопрос
Расставьте по порядку, что выполняется при первом вызове new Derived() (у обоих классов есть статические конструкторы, инициализаторы полей и конструкторы экземпляра; инициализаторы Derived не обращаются к статическим членам Base).
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Статический конструктор
Derived - 2Инициализаторы полей
Derived - 3Тело конструктора
Base - 4Тело конструктора
Derived - 5Инициализаторы полей
Base - 6Статический конструктор
Base
Показать ответ и разбор
Коротко
Правильный порядок
- 1Статический конструктор
Derived - 2Инициализаторы полей
Derived - 3Статический конструктор
Base - 4Инициализаторы полей
Base - 5Тело конструктора
Base - 6Тело конструктора
Derived
Разбор
Статический конструктор Derived срабатывает перед созданием его экземпляра. Затем выполняются инициализаторы полей Derived: в C# они идут до вызова базового конструктора. Когда управление доходит до конструктора Base, среда выполнения впервые обращается к типу Base и запускает его статический конструктор, потом инициализаторы полей Base. Тела конструкторов выполняются от базы к наследнику. Порядок статических конструкторов сдвинется, если инициализаторы Derived раньше обратятся к статическому члену Base. В Java иначе: инициализаторы полей наследника выполняются после базового конструктора, а статика базового класса инициализируется первой.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
new и override при вызове через базовый тип
Следующий вопрос
Порядок статических и обычных конструкторов
Термины по теме
Ещё по теме «ООП в C#»
- Абстрактный класс или интерфейс
- protected internal и private protected
- Методы интерфейса по умолчанию
- Явная реализация интерфейса
- Банковские счета: инкапсуляция и инварианты
- Фигуры: полиморфная площадь
- Чем new отличается от override
- Статическое поле общее для всех объектов