FishHook
Наследование используют тогда, когда нужен новый тип сущностей, расширяющий и/или уточняющий существующий тип.
Инкапсуляция нарушается. Производный тип начинает фиксировать базовый тип,
связывая код. Код производного класса влияет на код базового класса. Ты понапишешь на производном классе кучу кода, а потом вдруг ты поймёшь, что базовый класс надо изменить немного. И ты не сможешь его изменить вообще. Будешь сидеть в своей программе с легаси.
FishHook
Агрегация применяется тогда, когда некий тип сущностей является составной частью другого типа сущностей.
Да ты почитай, как это делается. Когда тебе нужно создать новый тип и у тебя тянутся руки к наследованию, остановись. Сделай обёртку и пробрось методы просто. И у тебя будет новый функционал, но при этом никакого изменения иерархии классов не будет.
FishHook
Еще более того, целые фреймворки построены на широком применении наследования (Django
А Django стал идеальным? А могут они его поменять сейчас? Нет, архитектура зафиксирована. То есть убрать метод какой-то они у же не могут, поменять его сигнатуру - тоже. Всё, кина не будет, теперь оно будет состариваться только.
FishHook
наследование обеспечивает такой всеми нами любимый полиморфизм
Да прям уж там. Полиморфизм обеспечивается через интерфейсы и их реализацию.
Полиморфизм - это когда ты в функцию, которая запускается действия у кошки, передаёшь собаку и всё работает правильно. А почему? А потому что объект, с которым идёт работа, абстрагирован. А при чём тут наследование? его тут вообще нет.