История изменений
Исправление quasimoto, (текущая версия) :
http://www.cs.uwm.edu/~boyland/fool2012/papers/fool2012_submission_3.pdf — как раз на основе подмножеств, пересечений, объединений и т.п., так что просто обязательно к ознакомлению :)
http://www.reddit.com/r/haskell/comments/1pjjy5/odersky_the_trouble_with_type...
А вот если смешивать агрегацию полей и наследование интерфейсов, как в C++, то действительно иногда возникают весёлые ситуации (например, делаем MaybeA : A и обеспечиваем хорошую (но не тривиальную) агрегацию и правильные публичные конструкторы, но забываем удалить или переопределить метод(ы) из AIface, так что MaybeAIface в итоге может ломать объекты — он же содержит методы которые для A предполагались).
Ещё вариант — простая агрегация и простые интерфейсы отдельно, как в Haskell (data A агрегируется в data MaybeA, при этом отдельный интерфейс в виде class Iface никак неявно ничего не ломает, так как требуется явного расписывания для A и MaybeA).
Исходная версия quasimoto, :
http://www.cs.uwm.edu/~boyland/fool2012/papers/fool2012_submission_3.pdf — как раз на основе подмножеств, пересечений, объединений и т.п., так что просто обязательно к ознакомлению :)
http://www.reddit.com/r/haskell/comments/1pjjy5/odersky_the_trouble_with_type...
А вот если смешивать агрегацию полей и наследование интерфейсов, как в C++, то действительно иногда возникают весёлые ситуации (например, делаем MaybeA : A и обеспечиваем хорошую (но не тривиальную) агрегацию и правильные публичные конструкторы, но забываем удалить или переопределить метод(ы) из AIface, так что MaybeAIface в итоге может ломать объекты — он же для A предполагался).
Ещё вариант — простая агрегация и простые интерфейсы отдельно, как в Haskell (data A агрегируется в MaybeA, при этом отдельный интерфейс в виде класса типов Iface никак неявно ничего не ломает, так как требуется явного расписывания для A и MaybeA).