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