Наследование в C#: базовые и производные классы, интерфейсы
Что такое наследование
Наследование — механизм, позволяющий определить новый класс на основе существующего. Производный (derived) класс наследует члены базового (base) класса. Реализует отношение IS-A (собака IS-A млекопитающее IS-A животное).
Преимущества: повторное использование кода, расширяемость, иерархия типов.
Синтаксис
class BaseClass { ... }
class DerivedClass : BaseClass { ... }
Пример: Shape и Rectangle
public class Shape
{
public void SetWidth(int w) => Width = w;
public void SetHeight(int h) => Height = h;
protected int Width; // доступно в наследниках
protected int Height;
}
public class Rectangle : Shape
{
public int GetArea() => Width * Height;
}
// Использование
Rectangle rect = new Rectangle();
rect.SetWidth(5);
rect.SetHeight(7);
Console.WriteLine(rect.GetArea()); // 35
Инициализация базового класса
Конструктор базового класса вызывается ПЕРЕД конструктором производного. Явный вызов через base(...):
public class Rectangle
{
protected double Length, Width;
public Rectangle(double l, double w) { Length = l; Width = w; }
public double GetArea() => Length * Width;
}
public class Tabletop : Rectangle
{
private double CostPerSqUnit = 70;
// Вызов базового конструктора
public Tabletop(double l, double w) : base(l, w) { }
public double GetCost() => GetArea() * CostPerSqUnit;
}
Множественное наследование
C# НЕ поддерживает множественное наследование классов (один базовый класс максимум). Но можно реализовать через интерфейсы:
public interface IPaintCost
{
int GetCost(int area);
}
public class Rectangle : Shape, IPaintCost
{
public int GetArea() => Width * Height;
public int GetCost(int area) => area * 70;
}
Модификаторы наследования
| Модификатор | Значение |
|---|---|
virtual | Метод/свойство можно переопределить в наследнике |
override | Переопределяет virtual/abstract член базового класса |
abstract | Обязательно к переопределению; класс тоже должен быть abstract |
sealed | Запрещает наследование класса или переопределение члена |
new | Скрывает унаследованный член (не переопределяет!) |
Пример: virtual / override
public class Shape
{
public virtual double Area() => 0;
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double Area() => Math.PI * Radius * Radius;
}
public class Square : Shape
{
public double Side { get; set; }
public override double Area() => Side * Side;
}
// Полиморфизм
Shape[] shapes = { new Circle { Radius = 2 }, new Square { Side = 3 } };
foreach (var s in shapes) Console.WriteLine(s.Area());
Base — доступ к членам базового класса
base.Method()— вызов реализации базового классаbase.Property— доступ к свойству базового классаbase()в конструкторе — вызов базового конструктора
Защищённые члены (protected)
Доступны в производных классах, но не снаружи. Идеально для полей, используемых наследниками.
Скрытие членов (new)
public class Base { public void Show() => Console.WriteLine("Base"); }
public class Derived : Base { public new void Show() => Console.WriteLine("Derived"); }
Base b = new Derived();
b.Show(); // "Base" — вызов через базовую ссылку
((Derived)b).Show(); // "Derived"
Используйте new осознанно (компилятор выдаст warning без него).
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Ключевое слово static в C#: статические переменные, методы и классы
- Вложенные классы в C#: определение, использование и наследование
- Шаблоны классов в C++: практическое руководство
- Наследование в Python: концепции, синтаксис и практические примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
- Структура программы на C#: основные компоненты и пример Hello World