Говорят, что композиция имеет ряд преимуществ перед наследованием, и лучше всего использовать именно композицию. Обьясните пожалуйста, почему так? Чем композиция лучше старого доброго наследования?
Композиция и наследование - это кардинально разные понятия, и я не знаю как можно их сравнить вообще...
Композиция - это части одногоо класса являются экземплярами других классов.
Наследование - это одна из основных парадигм ООП, которая говорит нам, что мы можем наследовать один класс другим, при этом "заимствуя" у родительского класса все публичные элементы (поля, методы и тд) классом-наследником.
Скажу сразу, что говорить что наследование - это плохо -- в корне не верно. Наследования в грамотных руках может принести море пользы, ровно как и вреда, если же использовать его бездумно.
В данном случае у нас есть такая штука как "разделение интерфейсов" из принципов SOLID. Напомню, что идея заключается в том, что множество маленьких интерфейсов значительно лучше чем один большой, поскольку с помощью нескольких паленьких интерфейсов мы можем ограничить наследуемые данные до необходимого минимума, при этом не захватывая ненужные данные с собой.
Собственно, в этом то и заключается сложность использования интерфейсов - подтягивание слишком большого количества лишней информации. Если проект большой и наследования много, то общее кол-во ненужных данных очень велико, из-за чего сильно страдает производительность и память. Использование композиции, например, практически искореняет данные проблемы.