поднимать холивар не хотелось бы (снова), но в ооп мире полиморфизм без наследования не реализуешь
То, что в большинстве ООП языков полиморфизм подтипов реализован через наследование (в том числе интерфейсов) не значит, что полиморфизм возможен только через наследование. Когда мы говорим про полиморфизм в ООП это в большинстве случаев subtyping. Он никакого отношения не имеет ни к наследованию ни к ООП. Полиморфизм подтипов это про типы, как ни странно)
Возьмём, например, Scheme (диалект LISP). В нем нет на уровне языка классов и интерфейсов. При этом он является мультипарадигменным языком, который поддерживает в том числе ООП. И там можно реализовать в том числе полиморфизм подтипов