Миксины и трейты
в чем разница между миксинами и чертами характера?
согласно Википедии, Ruby модули вроде как черты. Как же так?
2 ответов:
- миксины могут содержать состояние, (традиционные) черты-нет.
- миксины используют "неявное разрешение конфликтов", черты используют"явное разрешение конфликтов"
- Mixins зависит от линеаризации, черты сглажены.
ad 1. В mixins можно определить переменные экземпляра. Черты характера не позволяют этого. Состояние должно быть предоставлено путем составления класса (=класс с помощью черт)
ad 2. Может возникнуть конфликт имен. Два миксина (
MAиMB) или черты характера (TAиTB) определить метод с тем же самым определениемfoo():void.Mixin MA { foo():void { print 'hello' } } Mixin MB { foo():void { print 'bye' } } Trait TA { foo():void { print 'hello' } } Trait TB { foo():void { print 'bye' } }в mixins конфликты в сочинении класса
C mixins MA, MBнеявно решен.Class C mixins MA, MB { bar():void { foo(); } }этой
foo():voidСMAС другой стороны, при использовании признаков, составляя класс должен решить рознь.
Class C mixins TA, TB { bar():void { foo(); } }этот код вызовет конфликт (два определения
foo():void).ad 3. Семантика метода не зависит от того, определен ли он в признаке или в классе, который использует признак.
эти страницы объясняют разницу в языке программирования D.
Mixins в этом контексте код генерируется на лету, а затем вставляется в этот момент в коде во время компиляции. Довольно удобно для простых DSLs.
признаки-это внешние значения времени компиляции (а не код, созданный из внешнего источника). Разница очень тонкая. Миксины добавляют логику, признаки добавляют данные, такие как информация о типе времени компиляции.
Не знаю много о Ruby, но надеюсь, что это поможет несколько.
Comments