January 14, 2019

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

9. Какой будет результат выполнения следующего кода?

public sealed class Car
{
  public readonly int maxSpeed = 0;
  private int currSpeed;
  public Car()
  {
    maxSpeed = 220;
  }
  public Car(int max)
  {
    maxSpeed = max;
  }
  public int Speed
  {
    get { return currSpeed; }
    set
    {
      currSpeed = value;
      if (currSpeed > maxSpeed)
      {
        currSpeed = maxSpeed;
      }
    }
  }
}

public class B : Car
{
  public void Display()
  {
    Console.WriteLine(Speed);
  }
}

class Program
{
  static void Main(string[] args)
  {
    B b = new B();
    b.Speed = 300;
    b.Display();
  }
}
  • 0;
  • 220;
  • 300;
  • ошибка на этапе компиляции.

P.S. Не заметил, что class Car запечатанный, а значит class B не может от него наследовать.

10.Можно ли наследовать конструктор и деструктор базового класса?

  • да;
  • нет;
  • иногда.

P.S. Конструктор базового класса не наследуется, но можно использовать или расширять его через специально слово base.

11. В результате компиляции программы ниже возникнет ошибка, связанная с вызовом метода SomeMethod. Как его правильно вызвать, чтобы программа скомпилировалась?

interface IA
{
  void SomeMethod();
}
  
class A : IA
{
  void IA.SomeMethod()
  {
    Console.WriteLine("Hello");
  }
}
        
class Program
{
  static void Main(string[] args)
  {
    A a = new A();
    a.SomeMethod();
  }        
}
  • Никак. Ошибки не возникнет.
  • Использовать оператор as ((a as IA).SomeMethod()).
  • Использовать оператор is ((a is IA).SomeMethod()).
  • Использовать полное название метода a.IA.SomeMethod().

12. Что выведет программа ниже?

public class A
{
    public A()
    {
        Console.Write("A created; ");
    }
}

public class B : A
{
    private B()
    {
        Console.Write("B created; ");
    }

    public B(string str)
    {
        Console.Write("B created with string: {0}; ", str);
    }
}

public class C : B
{
    public C()
    {
        Console.Write("C created; ");
    }
}

class Program
{
    static void Main(string[] args)
    {
        A ab = new B("parameter");
        A ac = new C();

        Console.ReadKey();
    }        
}
  • A created; B created with string: parameter; A created; B created; C created;
  • Еще два варианта.
  • Программа не скомпилируется.

P.S. Будет ошибка на этапе компиляции, так как класс С не может наследовать от класса B с конструктором по умолчанию с доступом private.

13. Существует ли возможность отказаться от реализации абстрактного класса в классе наследнике?

  • Нет, невозможно отказаться от реализации абстрактного класса.
  • Да, если пометить класс-наследник атрибутом [NonAbstract].
  • Да, если пометить класс-наследник как абстрактный.
  • Да, достаточно не реализовывать ненужные методы и свойства.

14. Что неверно в определении следующих интерфейсов?

public abstract interface IAction
{
    void Move();
}

internal interface IRunAction : IAction
{
    void Run();
}
  • Интерфейсы не могут иметь модификатор доступа internal.
  • Интерфейсы не могут иметь модификатор abstract.
  • Интерфейс IRunAction должен определить метод Move, так как базовый интерфейс IAction является абстрактным.
  • От абстрактного интерфейса нельзя наследоваться.

P.S. Смекнул, что абстрактный интерфейс - это перебор.

15. Какая из строк вызовет ошибку компиляции?

interface IList
{
    int Count { get; set; }
}

interface ICounter
{
    void Count(int i);
}

interface IListCounter : IList, ICounter { }

class C
{
    void Test(IListCounter x)   // 1
    {
        x.Count(1);             // 2
        x.Count = 1;            // 3
    }
}

public class Program
{
    private static void Main(string[] args)
    {

    }
}
  • 1;
  • 2;
  • 3;
  • никакая, программа рабочая.

P.S. В данном случае название метода в приоритете, поэтому будет ошибка в строчке с одноимённым свойством.

16. Какое утверждение об абстрактных методах неверно?

  • Абстрактный метод неявно представляет собой виртуальный метод.
  • Объявления абстрактных методов допускаются только в виртуальных классах.
  • В объявлении абстрактного метода можно использовать статические или виртуальные модификаторы.
  • Чтобы реализовать абстрактный метод в классе-наследнике, необходимо использовать ключевое слово override.