Антипример: дублирование кода
Представьте, что мы пишем программу для автопарка. У нас есть обычные автомобили и грузовики. У них много общего, но у грузовиков есть дополнительная характеристика — грузоподъёмность.
Проблема: свойства brand, model, year, engine_volume и методы start(), stop() повторяются в двух классах. Это нарушает принцип DRY.
Если захочется добавить новое общее свойство (например, color), придётся менять оба класса.
Решение: наследование
Наследование — это механизм, позволяющий создать новый класс на основе уже существующего. Новый класс (потомок) получает все свойства и методы родительского класса и может добавлять свои.
Синтаксис: class ИмяПотомка extends ИмяРодителя.
Теперь класс Truck автоматически имеет все свойства и методы класса Car, плюс собственное свойство load_capacity. Дублирование кода исчезло!
Доступ к унаследованным свойствам и методам
Свойства и методы, объявленные в родительском классе, доступны потомку так же, как если бы они были объявлены в нём самом:
Потомок «видит» всё, что есть у родителя.
Конструкторы и parent()
Если у родительского класса есть конструктор, потомок может вызвать его с помощью ключевого слова parent(). Это нужно, чтобы не дублировать инициализацию унаследованных свойств.
parent() всегда должен быть первым в теле конструктора потомка.
Итог
- Наследование — механизм создания нового класса на основе существующего.
- Синтаксис:
class Потомок extends Родитель. - Потомок получает все свойства и методы родителя.
- parent() — вызов конструктора родительского класса из конструктора потомка.
- Потомок может переопределять методы родителя, давая свою реализацию.
- Наследование помогает избегать дублирования кода и выражает отношение «является» (is-a).