Основы синтаксиса наследования (:)
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 19 из 70.
Наследование позволяет классу приобретать свойства и методы другого класса. Вместо того чтобы переписывать один и тот же код, вы создаете базовый класс (родительский) с общим функционалом, а затем создаете производные классы (дочерние), которые наследуются от него.
В C# для указания наследования используется символ двоеточия ::
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}Класс Dog наследует всё от Animal. Он имеет доступ к свойству Name и методу Eat() без их повторного объявления, а также добавляет свой собственный метод Bark():
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Вывод: Buddy is eating.
myDog.Bark(); // Вывод: Buddy says Woof!C# поддерживает только одиночное наследование, что означает, что class может наследоваться только от одного базового class. Тем не менее, вы можете создавать цепочки наследования, в которых производный class становится базовым для другого class. Это создает иерархию, которая моделирует отношения реального мира, сохраняя ваш код организованным и пригодным для повторного использования.
Задание
ЛегкоДавайте создадим иерархию транспортных средств, которая демонстрирует, как наследование позволяет производным классам использовать функциональность базового класса, добавляя при этом свое собственное уникальное поведение.
Вы создадите три файла для организации своего кода:
Vehicle.cs: Определите классVehicleв пространстве именTransport. Это будет ваш базовый класс, который является общим для всех транспортных средств. Он должен иметь свойствоBrand(string) и свойствоYear(int), а также методStartEngine(), который выводит"{Brand} engine started."Car.cs: Определите классCarв пространстве именTransport, который наследуется отVehicle. Автомобиль добавляет собственное свойствоNumberOfDoors(int) и методHonk(), который выводит"{Brand} goes Beep Beep!"Program.cs: В основном файле создайте экземплярCar, используя входные значения. Установите его свойства (включая унаследованные), а затем продемонстрируйте, что автомобиль может использовать как свои собственные методы, так и методы, унаследованные отVehicle.
Вы получите три входных значения:
- Название бренда (Brand name)
- Год (Year)
- Количество дверей (Number of doors)
Выведите информацию об автомобиле и продемонстрируйте его возможности в следующем формате:
Car: {Brand} ({Year})
Doors: {NumberOfDoors}
{StartEngine output}
{Honk output}Например, если входные данные — Toyota, 2022 и 4, вывод должен быть следующим:
Car: Toyota (2022)
Doors: 4
Toyota engine started.
Toyota goes Beep Beep!Обратите внимание, как ваш Car может обращаться к свойству Brand и методу StartEngine(), хотя они определены в Vehicle. В этом и заключается сила наследования — производный класс автоматически получает все от своего базового класса!
Шпаргалка
Наследование позволяет классу приобретать свойства и методы другого класса, используя символ двоеточия ::
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}Производный класс (Dog) наследует все свойства и методы базового класса (Animal) и может добавлять свои собственные:
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Inherited method
myDog.Bark(); // Own methodC# поддерживает только одиночное наследование — класс может наследоваться только от одного базового класса. Однако вы можете создавать цепочки наследования для построения иерархий.
Попробуйте сами
using System;
using Transport;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string brand = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
int doors = Convert.ToInt32(Console.ReadLine());
// TODO: Создайте экземпляр Car
// TODO: Установите свойства автомобиля (Brand, Year, NumberOfDoors)
// TODO: Выведите информацию об автомобиле в требуемом формате:
// Car: {Brand} ({Year})
// Doors: {NumberOfDoors}
// Затем вызовите StartEngine() и Honk()
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов