В главе 5 рассматривался первый основной принцип объектно-ориентированного программирования (ООП) — инкапсуляция. Вы узнали, как строить отдельный четко определенный тип класса с конструкторами и разнообразными членами (полями, свойствами, методами, константами и полями только для чтения). В настоящей главе мы сосредоточим внимание на оставшихся двух принципах ООП: наследовании и полиморфизме.
Прежде всего, вы научитесь строить семейства связанных классов с применением
Глава завершится исследованием роли изначального родительского класса в библиотеках базовых классов .NET Core — System.Object
Базовый механизм наследования
Вспомните из главы 5, что
Когда вы устанавливаете между классами отношение "является", то тем самым строите зависимость между двумя и более типами классов. Основная идея, лежащая в основе классического наследования, состоит в том, что новые классы могут создаваться с применением существующих классов как отправной точки. В качестве простого примера создайте новый проект консольного приложения по имени BasicInheritance
Предположим, что вы спроектировали класс Car
namespace BasicInheritance
{
// Простой базовый класс.
class Car
{
public readonly int MaxSpeed;
private int _currSpeed;
public Car(int max)
{
MaxSpeed = max;
}
public Car()
{
MaxSpeed = 55;
}
public int Speed
{
get { return _currSpeed; }
set
{
_currSpeed = value;
if (_currSpeed > MaxSpeed)
{
_currSpeed = MaxSpeed;
}
}
}
}
}
Обратите внимание, что класс Car
_currSpead
посредством открытого свойства по имени Speed
. В данный момент с типом Car
можно работать следующим образом:using System;
using BasicInheritance;
Console.WriteLine("***** Basic Inheritance *****\n");
// Создать объект Car и установить максимальную и текущую скорости.
Car myCar = new Car(80) {Speed = 50};
// Вывести значение текущей скорости.
Console.WriteLine("My car is going {0} MPH", myCar.Speed);
Console.ReadLine();
Указание родительского класса для существующего класса
Теперь предположим, что планируется построить новый класс по имени MiniVan
Car
вы хотите определить класс MiniVan
так, чтобы он поддерживал данные для максимальной и текущей скоростей и свойство по имени Speed
, которое позволило бы пользователю модифицировать состояние объекта. Очевидно, что классы Car
и MiniVan
взаимосвязаны; фактически можно сказать, что MiniVan
"является" разновидностью Car
. Отношение "является" (формально называемое Существующий класс, который будет служить основой для нового класса, называется
MiniVan
следующего вида:namespace BasicInheritance
{
// MiniVan "является" Car.
sealed class MiniVan : Car
{
}
}