Ключевое слово 'base'
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 20 из 70.
Когда производный класс наследуется от базового класса, вам часто требуется обращаться к членам родительского класса напрямую. Ключевое слово base обеспечивает эту связь, позволяя вызывать конструктор базового класса или обращаться к его методам и свойствам.
Наиболее распространенным использованием base является вызов конструктора родительского класса. При создании производного объекта вы можете передавать значения в базовый класс:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}Синтаксис : base(name) вызывает конструктор Animal перед выполнением тела конструктора Dog. Это гарантирует, что базовый класс будет правильно инициализирован первым.
Вы также можете использовать base для вызова методов родительского класса из производного класса:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Вызывает метод Speak класса Animal
Console.WriteLine("Woof!");
}
}Здесь base.Speak() явно вызывает версию метода родительского класса. Это полезно, когда вы хотите расширить поведение родителя, а не полностью заменить его.
Задание
ЛегкоДавайте создадим систему инвентаризации товаров, которая демонстрирует, как производные классы используют ключевое слово base для правильной инициализации своего родительского класса и расширения унаследованного поведения.
Вы создадите три файла для организации вашего кода:
Product.cs: Определите классProductв пространстве именInventory. Этот базовый класс представляет любой товар со свойствомName(string) и свойствомPrice(decimal). Включите конструктор, который принимает оба значения, и методGetInfo(), который возвращает"{Name}: ${Price}".ElectronicProduct.cs: Определите классElectronicProductв пространстве именInventory, который наследуется отProduct. Этот класс добавляет свойствоWarrantyMonths(int). Конструктор должен принимать название, цену и количество месяцев гарантии — используйтеbaseдля передачи названия и цены в конструктор родителя. Создайте методGetInfo(), который сначала вызывает родительскийGetInfo()с помощьюbase, а затем добавляет" (Warranty: {WarrantyMonths} months)"для расширения вывода.Program.cs: В основном файле создайте объектElectronicProduct, используя входные значения, и выведите полную информацию о нем, вызвавGetInfo().
Вы получите три входных значения:
- Название товара
- Цена
- Месяцы гарантии
Выведите результат вызова GetInfo() для вашего электронного товара.
Например, если входные данные — Laptop, 999.99 и 24, вывод должен быть следующим:
Laptop: $999.99 (Warranty: 24 months)Обратите внимание, как производный класс дополняет вывод базового класса, а не дублирует логику. Ключевое слово base позволяет вам беспрепятственно повторно использовать и расширять поведение родителя!
Шпаргалка
Ключевое слово base позволяет производному классу обращаться к членам своего родительского класса.
Используйте base для вызова конструктора родительского класса:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}Синтаксис : base(name) вызывает родительский конструктор перед выполнением тела конструктора производного класса, обеспечивая правильную инициализацию.
Используйте base для вызова родительских методов из производного класса:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Вызывает метод Speak класса Animal
Console.WriteLine("Woof!");
}
}Это позволяет расширять поведение родительского класса, а не полностью заменять его.
Попробуйте сами
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string name = Console.ReadLine();
decimal price = Convert.ToDecimal(Console.ReadLine());
int warrantyMonths = Convert.ToInt32(Console.ReadLine());
// TODO: Создайте ElectronicProduct с введенными значениями
// TODO: Выведите результат вызова GetInfo() для вашего электронного продукта
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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'Необязательные параметрыИменованные аргументыПерегрузка методов