Любые разумные примеры создания наследования без создания отношений подтипирования?

Я преподавал ООП и пытался передать своим ученикам важное различие между наследованием и созданием отношения подтипа между двумя типами. Например, в С++ я мог бы использовать частное наследование, чтобы гарантировать, что никто из сторон не видит отношения подтипирования.

Однако, хотя я могу представить себе множество ситуаций, когда я не хотел бы создавать отношение подтипирования (например, реализовать Stack через двусвязный класс списка), я не могу действительно думать о хороших примерах дизайна где я на самом деле решил бы следовать наследованию, не создавая публичное отношение субтирования (а не, скажем, использовать агрегацию).

Любые идеи хороших примеров?

Ответ 1

Как программист на Python, позвольте мне сказать, что это вопросы, которые являются способом, слишком тонким. Они кажутся чисто С++-измами.

В Python у нас есть наследование, которое создает правильные подтипы.

И у нас есть композиция с использованием простых атрибутов или доступных коллекций.

Этот бизнес частного наследования, являющийся своего рода композицией, кажется, просто запутан. И в значительной степени бесполезно.

Примеры С++ показывают частное наследование для создания композиции с общим интерфейсом. В Java у нас будет общий интерфейс. В Python у нас есть утиная типизация и не нужны формализмы.

Я не думаю, что есть хорошие примеры - я думаю, что концепция слишком тонкая, чтобы иметь какую-то реальную ценность.

Ответ 3

В javascript у вас есть наследование с помощью прототипа. Который я бы не назвал подтипом. Поскольку в javascript-объектах не наследуются объекты, наследуемые от их прототипа, но в то же время объекты с одним и тем же прототипом независимы друг от друга и могут развиваться до очень разных типов объектов.