Поясните суть этих понятий. Есть ли какие-то устоявшиеся определения? В чем разница?
Например, на википедии написано:
Traits are similar to mixins, but whereas mixins can be composed only using the inheritance operation, traits offer a much wider selection of operations, including symmetric sum, method exclusion, and aliasing.
Что это за операции кроме наследования — symmetric sum, method exclusion, and aliasing?
Здравствуйте, include2h, Вы писали:
I>Что это за операции кроме наследования — symmetric sum, method exclusion, and aliasing?
Что они понимают под symmetric sum, фиг знает, а вот method exclusion и aliasing предположить можно.
Method exclusion — это когда мы при встраивании траита один из его публичных методов убираем из публичного интерфейса класса.
Aliasing — переименование метода, в траите он имеет одно имя, в финальном классе — другое.
Если не прав — пусть знатоки поправят.
Здравствуйте, include2h, Вы писали:
I>Поясните суть этих понятий. Есть ли какие-то устоявшиеся определения?
Как обычно — нужно читать что под этими терминами понимаются в конкретных реализация.
I>В чем разница?
mixins — это по сути абстрактный
подкласс. Т.е. если обычно в традиционных языках можно создать абстрактный суперкласс и от него отнаследоваться (специализация), то mixins работает в другую сторону и после применения микс-ина к некому классу получается в результате класс, где применённый миксин отнаследован от класса к которому его применяли. И, например, применение "super" в mix-in -е сошлётся на метод того класса, к которому mix-in применили.
Вообще, нужно понимать, что изначально mix-in были придуманы во всяких диалектах лиспа, где
объектная система устроена сильно иначе, чем в мэйнстримовых языках. И были они основаны на
комбинациях методов. Т.е. даже "абстрактный подкласс" это уже адаптация к более традиционным объектным системам. Дальше идут адаптации к тому, что можно сделать в конкретных условиях. В результате, что именно понимают под словом mix-in без документации не понять.
I>Например, на википедии написано:
I>Traits are similar to mixins, but whereas mixins can be composed only using the inheritance operation, traits offer a much wider selection of operations, including symmetric sum, method exclusion, and aliasing.
I>Что это за операции кроме наследования — symmetric sum, method exclusion, and aliasing?
"Traits" подобны абстрактным классам в том, что там можно реализовать методы, и подобны интерфейсам в том, что там нет состояния (полей класса). Но
traits это не механизм наследования, там используют другие операции — симметричная композиция, удаление/алиасинг методов. "Симметричная" в смысле не зависящая от порядка. Т.е. композиция двух traits всегда даёт один и тот же результат, а удаление/алиасинг используются для разрешения конфликтов. Применение traits к классу должно давать такое же поведение, как будто тело методов из traits было написано прямо в классе. Это важно, чтобы правильно работал "super" и "this/self". Но, опять же, конкретную семантику нужно смотреть в конкретной реализации.