C# C#  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Средний  · 

Наследование и интерфейсы

Исследует наследование, интерфейсы и полиморфизм через вызовы виртуальных членов, сокрытие, явную реализацию и выбор между наследованием и композицией. Важно не только предсказать вызванный метод, но и оценить устойчивость контракта.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 20
В каком порядке выполняются конструкторы?
C#
class Base { public Base() => Console.Write("B"); }
class Derived : Base { public Derived() => Console.Write("D"); }
_ = new Derived();
Вопрос 2 из 20
Когда protected-поле хуже protected-метода или свойства?
C#
public abstract class Document
{
    protected int Version; // наследник может нарушить инвариант
    protected void IncrementVersion() => Version++;
}
Вопрос 3 из 20
Почему Square : Rectangle может нарушить подстановку, если Width и Height меняются независимо?
Вопрос 4 из 20
Что обязан сделать конкретный наследник abstract-класса?
Вопрос 5 из 20
Когда композиция предпочтительнее наследования?
Вопрос 6 из 20
Какую реализацию Name вызовет ссылка Base на объект Derived?
C#
class Base { public virtual string Name() => "base"; }
class Derived : Base { public override string Name() => "derived"; }
Base x = new Derived();
Console.WriteLine(x.Name());
Вопрос 7 из 20
Как изменится результат, если Derived объявит public new string Name()?
C#
class Base { public string Name() => "base"; }
class Derived : Base { public new string Name() => "derived"; }
Base value = new Derived();
Console.WriteLine(value.Name());
Вопрос 8 из 20
Зачем вызывать base.Calculate() внутри override?
Вопрос 9 из 20
Почему вызов virtual-метода из конструктора опасен?
C#
class Base { public Base() { Print(); } public virtual void Print() { } }
class Derived : Base { private string text = "ready"; public override void Print() => Console.WriteLine(text.Length); }
Вопрос 10 из 20
Когда метод следует оставить невиртуальным?
Вопрос 11 из 20
Что позволяет интерфейс, чего не позволяет наследование классов?
Вопрос 12 из 20
Почему параметр IEnumerable<T> часто лучше List<T>?
C#
static int CountPositive(IEnumerable<int> values) =>
    values.Count(x => x > 0);

var result = CountPositive(new HashSet<int> { -1, 2, 3 });
Вопрос 13 из 20
Какой риск у добавления абстрактного члена в широко используемый интерфейс?
Вопрос 14 из 20
Какой объект можно передать в метод?
C#
static void Run(ILogger logger) => logger.Log("start");
sealed class ConsoleLogger : ILogger { public void Log(string s) => Console.WriteLine(s); }
Вопрос 15 из 20
Что означает принцип разделения интерфейсов?
Вопрос 16 из 20
Почему вызов obj.Reset() не компилируется?
C#
class Device : IResettable
{
    void IResettable.Reset() { }
}
var obj = new Device();
// obj.Reset();
Вопрос 17 из 20
Когда явная реализация особенно полезна?
Вопрос 18 из 20
Какую строку составят две явные реализации Name через IA и IB?
C#
interface IA { string Name(); }
interface IB { string Name(); }
class X : IA, IB
{
    string IA.Name() => "A";
    string IB.Name() => "B";
}
var x = new X();
Console.Write(((IA)x).Name() + ((IB)x).Name());
Вопрос 19 из 20
Можно ли явно реализованный член объявить public?
Вопрос 20 из 20
Как протестировать явную реализацию IAsyncDisposable.DisposeAsync?
C#
IAsyncDisposable resource = new MyResource();
await resource.DisposeAsync();

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу