Разбор теста от proglib.io, ч.1
Зачёркнутым шрифтом выделены мои неправильные ответы, жирным - верные ответы на вопросы.
- ООП поддерживает два вида связывания объектов с кодом методов. Соответствующие методы называются:
- виртуальными и абстрактными;
- статическими и виртуальными;
абстрактными и статическими;- публичными и приватными.
P.S. Соответствующие виды связывания: раннее и позднее. Понятия не имел о правильном ответе. Даже после выяснения верного варианта...
2. Какая разница между идентичностью и равенством объектов?
- Идентичность означает, что у объектов есть общий неабстрактный предок, а равенство - любой общий предок.
- Идентичность означает, что у объектов одинаковые поля, а равенство - что они содержат одинаковые данные.
- Идентичность означает, что объекты являются экземпляром одного и того же класса, а равенство - что они содержат одинаковые данные.
- Идентичность означает, что две ссылки указывают на один и тот же объект, а равенство - что они содержат одинаковые данные.
3. Какое утверждение верно?
- От структуры так же, как и от класса, можно наследоваться.
- Если структура или объект класса присваивается новому объекту, то в новую переменную сохраняется копия всех данных.
- Структура является размерным типом, а класс - ссылочный.
- В структуре нельзя определять конструктор.
4. В чём разница между перегрузкой (overloading) и переопределением (overriding)?
- Её не существует. Оба понятия описывают одно и то же явление.
- Перегрузка означает наличие двух методов с теми же аргументами, но с различными реализациями. Один из них будет существовать в родительском классе, а другой - в производном или дочернем классе.
- Переопределение означает наличие двух или более методов в одном классе с тем же именем, но с разными аргументами.
- Ни один из предложенных вариантов не является верным.
P.S. Пункты 2 и 3 являются определениями для переопределения и перегрузки соответственно.
5. Скомпилируется ли программа ниже?
public class A { public string Str { get; protected internal set; } = "Hello"; } class Program { static void Main(string[] args) { A a = new A(); a.Str += " World"; Console.WriteLine(a.Str); } }
- да;
ещё три варианта.
P.S. Что-то меня смутил модификатор доступа сеттера свойства Str, и я ответил неверно. Хотя классы и члены классов с модификатором доступаprotected internal доступны из текущей сборки (и из производных классов).
6. Какое из утверждений верно?
- У интерфейсов можно объявлять свойства, но без тела у методов доступа свойства.
- У интерфейсов нельзя объявлять свойства.
- У интерфейсов можно объявлять свойства с помощью ключевого слова "property".
У интерфейсов можно объявлять свойства так же, как и у классов.
7. Что выведет код?
public class A { private string str = "Hello"; public string Str { set { str = value; } } } class Program { static void Main(string[] args) { A a = new A(); a.Str = " World"; Console.WriteLine(a.Str); } }
- Hello;
- ошибка на этапе компиляции;
что-то ещё.
P.S. Программа не скомпилируется, т.к. у свойства отсутствует метод для чтения, который необходим при выводе значения свойства в консоль.
8. Какое утверждение неверно?
- Свойства позволяют управлять доступом к переменной.
- В свойства мы можем вложить дополнительную логику.
- В каждом свойстве должны быть get и set блоки.
- Благодаря свойствам, реализуется один из принципов ООП - инкапсуляция.