Наследование в C#

Наследование в C#: базовые и производные классы, ключевые слова base и override, цепочка наследования.

Наследование позволяет создать новый класс на основе существующего. Производный класс получает все члены базового и может добавлять собственные или переопределять унаследованные.

Базовый и производный класс

class Animal          // базовый класс
{
    public string Name { get; set; }

    public Animal(string name) { Name = name; }

    public void Eat()
    {
        Console.WriteLine($"{Name} ест.");
    }
}

class Dog : Animal    // Dog наследует Animal
{
    public string Breed { get; set; }

    public Dog(string name, string breed) : base(name)  // вызов конструктора базового
    {
        Breed = breed;
    }

    public void Fetch()
    {
        Console.WriteLine($"{Name} приносит мяч!");
    }
}

var d = new Dog("Рекс", "Овчарка");
d.Eat();    // унаследован от Animal
d.Fetch();  // собственный метод

Вывод:

Рекс ест.
Рекс приносит мяч!

Переопределение методов: virtual и override

Чтобы позволить потомку изменить поведение метода, пометьте его в базовом классе как virtual, а в потомке используйте override:

class Shape
{
    public virtual double Area() => 0;

    public void Print()
    {
        Console.WriteLine($"Площадь: {Area():F2}");
    }
}

class Circle : Shape
{
    private double _r;
    public Circle(double r) { _r = r; }

    public override double Area() => Math.PI * _r * _r;
}

class Rectangle : Shape
{
    private double _w, _h;
    public Rectangle(double w, double h) { _w = w; _h = h; }

    public override double Area() => _w * _h;
}

Shape[] shapes = { new Circle(5), new Rectangle(4, 6) };
foreach (var s in shapes)
    s.Print();

Вывод:

Площадь: 78.54
Площадь: 24.00

Ключевое слово base

base обращается к базовому классу: можно вызвать его конструктор (base(args)) или метод (base.Method()):

class Animal
{
    public virtual void Speak() => Console.WriteLine("...");
}

class Cat : Animal
{
    public override void Speak()
    {
        base.Speak();           // сначала базовое поведение
        Console.WriteLine("Мяу!");
    }
}

new Cat().Speak();

Вывод:

...
Мяу!

Запрет наследования: sealed

Класс или метод с модификатором sealed нельзя унаследовать / переопределить дальше:

sealed class FinalClass { }
// class Child : FinalClass { }  // ← ошибка компиляции

Коротко

  • Наследование: class Child : Parent — Child получает всё из Parent.
  • base(args) вызывает конструктор базового класса; base.Method() — его метод.
  • virtual в базовом + override в потомке — переопределение поведения.
  • sealed запрещает дальнейшее наследование.
Проверьте себя
1. Как в C# объявить, что класс Dog наследует Animal?
Aclass Dog extends Animal
Bclass Dog : Animal
Cclass Dog implements Animal
Dclass Dog inherits Animal
2. Для чего нужно ключевое слово virtual?
AЧтобы запретить наследование метода
BЧтобы разрешить потомкам переопределить метод через override
CЧтобы сделать метод статическим
DЧтобы вызвать метод базового класса
3. Что делает base(args) в конструкторе потомка?
AСоздаёт новый объект базового класса
BВызывает конструктор базового класса
CБлокирует вызов базового конструктора
DЭто синтаксическая ошибка
Поддержать проект