LINUX.ORG.RU

История изменений

Исправление ilammy, (текущая версия) :

Вот эти случаи не нельзя, а просто неудобно. Надо руками прописывать ограничения на состояние объектов подкласса во всех-всех его методах. Навешивание предиката делает это автоматически.

Вот что точно нельзя сделать наследованием, но можно предикатами — так это известная проблема круга и эллипса. Нельзя отнаследовать круг от эллипса, потому что методы эллипса могут нарушать контракт круга. Зато круг очень естественно представляется как (and? <ellipse> equal-axes?) — и круги автоматически теряют свою «круглость», если их изменят соответствующим образом, но при этом они остаются подтипами эллипсов.

Но и подклассы — это не подтипы. Так что неудивительно, что наследование не может представить вообще весь спектр отношений между типами. Но диспетчеризация по классам реализуется эффективнее предикатной, поэтому-то и классы и используются.

Исходная версия ilammy, :

Вот эти случаи не нельзя, а просто неудобно. Надо руками прописывать ограничения на состояние объектов подкласса во всех-всех его методах. Навешивание предиката делает это автоматически.

Вот что точно нельзя сделать наследованием, но можно предикатами — так это известная проблема круга и эллипса. Нельзя отнаследовать круг от эллипса, потому что методы эллипса могут нарушать контракт круга. Зато круг очень естественно представляется как (and? <ellipse> equal-axes?) — и круги автоматически теряют свою «круглость», если их изменят соответствующим образом, но при этом они остаются подтипами эллипсов.

Но и подклассы — это не подтипы. Так что неудивительно, что наследование не может представить вообще весь спектр отношений между типами.