January 14, 2019

Разбор теста от proglib.io, ч.1

Зачёркнутым шрифтом выделены мои неправильные ответы, жирным - верные ответы на вопросы.

  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 блоки.
  • Благодаря свойствам, реализуется один из принципов ООП - инкапсуляция.