Какое ключевое слово применяется для переопределения виртуальных методов и свойств:
overridable
override
overriding
overriden
override
Что будет выведено на консоль в результате выполнения следующей программы и почему:
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.
Что будет выведено на консоль в результате выполнения следующей программы и почему:
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.
Что будет выведено на консоль в результате выполнения следующей программы и почему:
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(); } }
Программа не скомпилируется, потому что переопределяемый метод в производном классе должен иметь тот же модификатор доступа, что и виртуальный метод в базовом классе.
Для чего нужен модификатор sealed?
Модификатор sealed позволяет запретить наследование от класса и переопределение метода.
Что будет выведено на консоль в результате выполнения следующей программы и почему?
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.