← Все вопросы

Как работает наследование классов в C# и что делает base?

Задан 30 месяцев назад422 просмотров2 ответа
10

Перешёл с другого языка, там было extends. В C# наследование пишется через двоеточие? И зачем нужно base и virtual/override?

class Animal { public void Eat() {} }
class Dog : Animal { }

2 ответа

17
✓ Принятый ответ — помог автору

Верно, в C# нет слова extends — наследование обозначается двоеточием: class Dog : Animal. Класс-потомок получает все доступные члены родителя.

class Animal
{
    public string Name;
    public void Eat() => Console.WriteLine($"{Name} ест");
    public virtual void Voice() => Console.WriteLine("..."); // можно переопределить
}

class Dog : Animal
{
    public override void Voice() => Console.WriteLine("Гав!"); // переопределяем
}

var d = new Dog { Name = "Рекс" };
d.Eat();   // Рекс ест  — унаследовано
d.Voice(); // Гав!      — переопределено

Ключевые слова:

  • virtual в базовом классе разрешает потомку переопределить метод;
  • override в потомке выполняет это переопределение;
  • base обращается к версии родителя — к его конструктору или методу.
class Puppy : Dog
{
    public override void Voice()
    {
        base.Voice();            // вызвать «Гав!» родителя
        Console.WriteLine("(тонко)");
    }
}

Важные ограничения C#: множественного наследования классов нет — можно наследоваться только от одного класса (но реализовывать сколько угодно интерфейсов). Все классы неявно наследуются от object.

6

Совет: не увлекайтесь глубокими иерархиями наследования. Часто лучше работает композиция (объект содержит другой объект как поле) или интерфейсы.

Правило-ориентир: наследование уместно, когда между типами реально отношение «является» (Dog является Animal). Если отношение «имеет» (у Машины есть Двигатель) — это поле, а не наследование.

class Engine { public void Start() {} }
class Car
{
    private Engine engine = new(); // композиция, не наследование
    public void Go() => engine.Start();
}

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект