После исправления синтаксиса вывод будет BBB, затем BBB. В приведённом виде программа не компилируется из-за регистра имён, пропущенной точки с запятой и точки входа.
Какие строки будут напечатаны в консоли
После исправления синтаксиса вывод будет BBB, затем BBB. В приведённом виде программа не компилируется из-за регистра имён, пропущенной точки с запятой и точки входа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В примере объявлены два класса:
ClassAсодержит виртуальный методTest()и конструктор, в котором этот метод вызывается.ClassBнаследуетClassAи переопределяет методTest(). Также в его конструкторе происходит вызовTest(). Какой вывод появится в консоли при создании экземпляраClassB?
public class ClassA
{
public ClassA()
{
Test()
}
public virtual void test()
{
Console.WriteLine("AAA");
}
}
public class ClassB : ClassA
{
public ClassB()
{
Test();
}
public override void Test()
{
Console.WriteLine("BBB");
}
}
public class Main()
{
Main()
{
classB t = new();
}
}
Ответ
После исправления синтаксиса вывод будет BBB, затем BBB. В приведённом виде программа не компилируется из-за регистра имён, пропущенной точки с запятой и точки входа.
Нужно добавить ; после Test() в базовом конструкторе, переименовать test в Test, исправить classB на ClassB и оформить обычный static void Main() в классе Program. Конструктор класса с именем Main не является точкой входа программы.
При new ClassB() сначала исполняется конструктор ClassA. Виртуальный вызов выбирает ClassB.Test и печатает BBB. После него тело конструктора ClassB повторяет вызов. AAA не выводится, поскольку переопределение не вызывает base.Test().