Виртуальные методы и свойства

Последнее обновление: 03.08.2018
Вопрос 1

Какое ключевое слово применяется для переопределения виртуальных методов и свойств:

  • overridable

  • override

  • overriding

  • overriden

override

Вопрос 2

Что будет выведено на консоль в результате выполнения следующей программы и почему:

class Person
{
	public string Name { get; set; }
	public virtual void Display()
	{
		Console.WriteLine($"Person {Name}");
	}
}
class Employee : Person
{
	public string Company { get; set; }
	public override void Display()
	{
		Console.WriteLine($"Employee {Name}");
	}
}
class Program
{
	static void Main(string[] args)
	{
		Person person = new Employee { Name = "Sam", Company = "Microsoft" };
		person.Display();
		
		Console.ReadKey();
	}
}

На консоль будет выведена строка "Employee Sam". Потому что переменная person хранит ссылку на объект Employee, и при вызове метода Display будет использоваться именно реализация данного метода в классе Employee.

Вопрос 3

Что будет выведено на консоль в результате выполнения следующей программы и почему:

class Person
{
	public string Name { get; set; }
	public virtual void Display()
	{
		Console.WriteLine($"Person {Name}");
	}
}
class Employee : Person
{
	public string Company { get; set; }
	public override void Display()
	{
		Console.WriteLine($"Employee {Name}");
	}
}
class Manager : Employee
{
	public override void Display()
	{
		Console.WriteLine($"Manager {Name}");
	}
}
class Program
{
	static void Main(string[] args)
	{
		Person person = new Manager { Name = "Bob", Company = "Microsoft" };
        Employee employee = (Employee)person;
        employee.Display();
		
		Console.ReadKey();
	}
}

На консоль будет выведена строка "Manager Bob". Потому что переменная person хранит ссылку на объект Manager. При преобразовании к типу Employee ссылка по прежнему представляет объект типа Manager, и при вызове метода Display будет использоваться реализация метода из класса Manager.

Вопрос 4

Что будет выведено на консоль в результате выполнения следующей программы и почему:

class Auto
{
	protected internal virtual void Move()
	{
		Console.WriteLine("Auto is moving");
	}
}
class Track : Auto
{
	public override void Move()
	{
		Console.WriteLine("Track is moving");
	}
}
class Program
{
	static void Main(string[] args)
	{
		Track track = new Track();
		Auto auto = track;
		auto.Move();
            
		Console.ReadKey();
	}
}

Программа не скомпилируется, потому что переопределяемый метод в производном классе должен иметь тот же модификатор доступа, что и виртуальный метод в базовом классе.

Вопрос 5

Для чего нужен модификатор sealed?

Модификатор sealed позволяет запретить наследование от класса и переопределение метода.

Вопрос 6

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

class Auto
{
	public sealed void Display()
	{
		Console.WriteLine("Auto");
	}
}
class Truck : Auto
{
	public void DisplayInfo()
	{
		base.Display();
	}
}
class Program
{
	static void Main(string[] args)
	{
		Truck truck = new Truck();
		truck.DisplayInfo();
		Console.ReadKey();
	}
}

Данная программа не скомпилируется, так как модификатор sealed применяется только в связке с оператором override.

Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850