Menu
Coddy logo textTech

Ключевое слово '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() явно вызывает версию метода родительского класса. Это полезно, когда вы хотите расширить поведение родителя, а не полностью заменить его.

challenge icon

Задание

Легко

Давайте создадим систему инвентаризации товаров, которая демонстрирует, как производные классы используют ключевое слово 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() для вашего электронного продукта
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование