Как работает наследование классов в C# и что делает base?
Перешёл с другого языка, там было extends. В C# наследование пишется через двоеточие? И зачем нужно base и virtual/override?
class Animal { public void Eat() {} }
class Dog : Animal { }
2 ответа
Верно, в 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.
Совет: не увлекайтесь глубокими иерархиями наследования. Часто лучше работает композиция (объект содержит другой объект как поле) или интерфейсы.
Правило-ориентир: наследование уместно, когда между типами реально отношение «является» (Dog является Animal). Если отношение «имеет» (у Машины есть Двигатель) — это поле, а не наследование.
class Engine { public void Start() {} }
class Car
{
private Engine engine = new(); // композиция, не наследование
public void Go() => engine.Start();
}