Ответ
Преимущества:
- Повторное использование кода (Code Reusability): Дочерние классы наследуют поля и методы родительского класса, избегая дублирования.
- Полиморфизм: Возможность переопределять методы родительского класса для изменения поведения в подклассах.
- Чёткая иерархия: Моделирует отношения "является" (is-a), что упрощает понимание структуры программы.
Недостатки:
- Жёсткая связность (Tight Coupling): Изменения в родительском классе могут непреднамеренно сломать работу дочерних классов.
- Нарушение инкапсуляции: Дочерние классы зависят от внутренней реализации родителя, а не только от его публичного контракта.
- Ограничения в дизайне: В языках вроде Java отсутствует множественное наследование классов, что может усложнить проектирование.
- Хрупкость базового класса (Fragile Base Class Problem): Легко создать непреднамеренные побочные эффекты.
Пример на Java:
class Animal {
void eat() {
System.out.println("Animal is eating...");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("Dog eats meat"); // Полиморфизм
}
}
Рекомендация: Часто предпочтительнее использовать композицию (отношение "имеет" - has-a) вместо наследования, особенно если нет чёткой иерархической связи. Это повышает гибкость и снижает связность компонентов.