Какие преимущества и недостатки наследования в ООП?

«Какие преимущества и недостатки наследования в ООП?» — вопрос из категории ООП, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Преимущества:

  • Повторное использование кода (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) вместо наследования, особенно если нет чёткой иерархической связи. Это повышает гибкость и снижает связность компонентов.