Разбор теста от 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.