Наследование

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

Почему следующая программа не компилируется:

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.

Вопрос 2

Даны следующие классы:

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");

Какие конструкторы и в каком порядке в данном случае будет выполняться?

Порядок выполнения конструкторов:

  1. System.Object.Object()

  2. Person(string name, int age)

  3. Person(string name)

  4. Employee(string name, string company)

Вопрос 3

Как запретить наследование от класса?

Указать при определении класса модификатор sealed

Вопрос 4

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

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();
	}
}

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

Вопрос 5

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

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".

Вопрос 6

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

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".

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