Разбор теста от 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.
Ещё больше интересной информации на нашем Telegram канале.