ООП
Классы и объекты, конструкторы и их цепочки, модификаторы доступа, абстракция и абстрактные классы.
6 вопросов
JuniorТеорияОчень частоЧто такое конструктор в C# и когда предоставляется конструктор по умолчанию?
Что такое конструктор в C# и когда предоставляется конструктор по умолчанию?
Конструктор — это особый метод, выполняемый при создании объекта через new и инициализирующий поля нового экземпляра. Он совпадает с именем класса и не имеет типа возврата. Если вы не объявите конструктор, компилятор предоставит public без параметров по умолчанию; как только объявите любой конструктор, этот умолчательный исчезает. Конструкторы можно перегружать по списку параметров.
Типичные ошибки
- ✗Думать, что компилятор сохраняет конструктор по умолчанию после объявления собственного
- ✗Считать, что у конструктора есть тип возврата или что его вызывают по имени после
new - ✗Полагать, что у класса может быть лишь один конструктор и его нельзя перегружать
Уточняющие вопросы
- →Что инициализирует поле, если ни один конструктор явно его не присваивает?
- →Как компилятор выбирает, какой перегруженный конструктор вызовет
new?
JuniorТеорияЧастоВ чём разница между классом и объектом в C#?
В чём разница между классом и объектом в C#?
class — это шаблон ссылочного типа, описывающий состояние (поля) и поведение (методы) некоторой сущности. Объект — конкретный экземпляр этого класса, размещённый в куче через new и хранящий собственные значения полей. Один класс описывает множество объектов; переменная содержит ссылку на объект, а не сам объект.
Типичные ошибки
- ✗Путать класс (определение) с объектом (его экземпляром во время выполнения)
- ✗Считать, что переменная класса хранит объект встроенно, а не ссылку на него
- ✗Полагать, что все объекты класса делят один набор значений полей
Уточняющие вопросы
- →Что произойдёт с двумя переменными, которым присвоена одна ссылка на объект?
- →Где живут поля объекта, а где переменная со ссылкой?
MiddleТеорияЧастоКогда выбирать абстрактный класс вместо интерфейса в C#?
Когда выбирать абстрактный класс вместо интерфейса в C#?
Абстрактный (abstract) класс — один базовый, от которого можно наследоваться, и он может нести реализацию, поля и конструктор, моделируя отношение «is-a» с общим состоянием. Интерфейс — чистый контракт (без состояния экземпляра), который реализуют многие типы, моделируя возможность «can-do». Берите абстрактный класс, чтобы делить код/состояние между близкой роднёй; берите интерфейс ради возможности у несвязанных типов.
Типичные ошибки
- ✗Считать, что абстрактный класс не может нести реализацию, поля или конструктор
- ✗Думать, что тип наследует несколько абстрактных классов так же, как реализует много интерфейсов
- ✗Пытаться создать абстрактный класс напрямую через
new
Уточняющие вопросы
- →Раз в C# появились методы интерфейса по умолчанию, когда абстрактный класс всё ещё нужен?
- →Чем абстрактный метод отличается от
virtual-метода с телом?
MiddleТеорияЧастоКаковы модификаторы доступа в C# и каков доступ по умолчанию для членов класса?
Каковы модификаторы доступа в C# и каков доступ по умолчанию для членов класса?
В C# их шесть: public (везде), private (только тот же тип), protected (тип и его наследники), internal (та же сборка), protected internal (та же сборка ИЛИ производный тип — объединение) и private protected (та же сборка И производный тип — пересечение). Член класса без модификатора по умолчанию private; тип верхнего уровня по умолчанию internal.
Типичные ошибки
- ✗Перечислять лишь четыре модификатора, упуская
protected internal/private protected - ✗Путать смыслы ИЛИ (объединение) и И (пересечение) у комбинированных модификаторов
- ✗Полагать, что непомеченный член класса по умолчанию
public, а неprivate
Уточняющие вопросы
- →Почему
protected internalшире по охвату, чемprivate protected? - →Какова доступность по умолчанию у класса верхнего уровня против вложенного?
MiddleТеорияИногдаКак : this(...) и : base(...) связывают конструкторы в C#?
Как : this(...) и : base(...) связывают конструкторы в C#?
Инициализатор конструктора связывает настройку до выполнения тела. : this(...) перенаправляет к другому конструктору в ТОМ ЖЕ классе, централизуя общую инициализацию. : base(...) вызывает конкретный конструктор БАЗОВОГО класса. Построение идёт сверху-вниз: конструктор базового (явный или неявный безпараметрический base()) завершается до выполнения тела производного, так что код производного видит инициализированный базовый.
Типичные ошибки
- ✗Путать смыслы
: this(...)и: base(...) - ✗Думать, что тело производного выполняется до завершения конструктора базового
- ✗Считать, что
: this(...)может перенаправить к конструктору другого класса
Уточняющие вопросы
- →Если не писать
: base(...), какой конструктор базового вызовет компилятор? - →Могут ли два конструктора связаться друг с другом через
: this(...)и образовать цикл?
SeniorТеорияИногдаЧто такое статический конструктор в C# и когда он выполняется?
Что такое статический конструктор в C# и когда он выполняется?
Статический (static) конструктор инициализирует статическое состояние типа. Он не принимает параметров и модификатора доступа, и его никогда не вызывают напрямую. Среда выполнения запускает его автоматически ровно ОДИН раз на тип, лениво, прямо перед созданием первого экземпляра или обращением к любому статическому члену. Поэтому он может выполниться до или после Main в зависимости от того, когда тип впервые затронут.
Типичные ошибки
- ✗Думать, что статический конструктор берёт параметры, модификатор или вызывается напрямую
- ✗Считать, что он выполняется на экземпляр или поток, а не один раз на тип
- ✗Полагать, что он всегда выполняется до
Mainнезависимо от первого использования типа
Уточняющие вопросы
- →Что станет с типом, если его статический конструктор выбросит исключение?
- →Как
beforefieldinitменяет момент срабатывания статического конструктора?