Почему следующая программа не компилируется:
using System; namespace HelloApp { class Program { static void Main(string[] args) { Person tom = new Employee(); Console.ReadKey(); } } internal class Person { } public class Employee : Person { } }
Производный класс не может иметь больщий уровень доступа или быть более доступным, чем базовый класс. Здесь же базовый класс Person имеет модификатор internal, а производный класс Employee - модификатор public. Таким образом, класс Employee является более доступным чем Person.
Даны следующие классы:
class Person { string name; int age; public Person() { } public Person(string name) : this(name, 18) { } public Person(string name, int age) { this.name = name; this.age = age; } } class Employee : Person { string company; public Employee() { } public Employee(string name, int age, string company): base(name, age) { this.company = company; } public Employee(string name, string company) : base(name) { this.company = company; } }
Допустим, мы создаем объект класса Employee следующим образом:
Employee tom = new Employee("Tom", "Microsoft");
Какие конструкторы и в каком порядке в данном случае будет выполняться?
Порядок выполнения конструкторов:
System.Object.Object()
Person(string name, int age)
Person(string name)
Employee(string name, string company)
Как запретить наследование от класса?
Указать при определении класса модификатор sealed
Что выведет на консоль следующая программа и почему?
class Auto // легковой автомобиль { public int Seats { get; set; } // количество сидений public Auto(int seats) { Seats = seats; } } class Truck : Auto // грузовой автомобиль { public decimal Capacity { get; set; } // грузоподъемность public Truck(int seats, decimal capacity) { Seats = seats; Capacity = capacity; } } class Program { static void Main(string[] args) { Truck truck = new Truck(2, 1.1m); Console.WriteLine($"Грузовик с грузоподъемностью {truck.Capacity} тонн"); Console.ReadKey(); } }
Программа не скомпилируется, потому что в базовом классе не определен конструктор без параметров, поэтому производный обязан вызвать один из конструкторов базового класса.
Что выведет на консоль следующая программа и почему?
class Auto // легковой автомобиль { public int Seats { get; set; } // количество сидений public Auto() { Console.WriteLine("Auto has been created"); } public Auto(int seats) { Seats = seats; } } class Truck : Auto // грузовой автомобиль { public decimal Capacity { get; set; } // грузоподъемность public Truck(decimal capacity) { Seats = 2; Capacity = capacity; Console.WriteLine("Truck has been created"); } } class Program { static void Main(string[] args) { Truck truck = new Truck(1.1m); Console.WriteLine($"Truck with capacity {truck.Capacity}"); Console.ReadKey(); } }
Консольный вывод программы:
Auto has been created Truck has been created Truck with capacity 1,1
При создании объекта производного класса вначале вызываются конструкторы базового класса. Поскольку в данном случае консструктор Truck явным образом не вызывает ни одного конструктора, то неявно вызывается конструктор базового класса по умолчанию, который выводит строку "Auto has been created". Затем собственно выполняется конструктор производного класса, который выводит строку "Truck has been created".
Что выведет на консоль следующая программа и почему?
class Person { public string Name { get; set; } = "Ben"; public Person(string name) { Name = "Tim"; } } class Employee : Person { public string Company { get; set; } public Employee(string name, string company) : base("Bob") { Company = company; } } class Program { static void Main(string[] args) { Employee emp = new Employee("Tom", "Microsoft") { Name = "Sam" }; Console.WriteLine(emp.Name); // Ben Tim Bob Tom Sam Console.ReadKey(); } }
Программа выведет на консоль имя "Sam". Вне зависимости от того, в каком порядке и какие конструкторы вызываются, инициализатор производного класса будет выполняться в самую последнюю очередь. Поэтому финальное значение свойства Name будет равно "Sam".