Интерфейсы. Изначально ООП обходилось без них. Позже в C++ была неудачная попытка использовать вместо них классы, которая, однако, привела к пониманию проблемы и открыла путь к её решению. Нужна была абстракция поведения вне классификации и интерфейсы воплотили её. Окружающие нас объекты дружно игнорируют SRP -- гвоздь, ведро, автомобиль помимо своего индивидуального поведения имеют и общее: их можно купить, у них есть положение и габариты и они ржавеют со временем. Для отражения общих черт не хватает иерархической классификации, при которой наследование поведения возможно лишь по одной линии. Можно добавить в иерархию промежуточные классы, поскольку общее поведение есть у каждого из приведенных объектов, но добавление в список стеклянного стакана нарушит идиллию, поскольку он не ржавеет. Интерфейсы товара, тела и взаимодействия с атмосферой, обеспечат полиморфизм в работе с объектами без необходимости сводить всё в одну иерархию. Классы имеют реализацию, которая всегда тянет за собой