Mixins против черт

Ответы:

214
  1. Mixins могут содержать состояние, (традиционные) черты не имеют.
  2. Миксины используют «неявное разрешение конфликтов», черты используют «явное разрешение конфликтов»
  3. Mixins зависит от линеаризации, черты уплощены.

Лекция о чертах

Объявление 1. В миксинах вы можете определить переменные экземпляра. Черты не позволяют этого. Состояние должно обеспечиваться составлением класса (= класс, использующий черты)

Объявление 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'
    }
}

В миксинах конфликты в составе классов 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. Семантика метода не зависит от того, определен он в признаке или в классе, который использует признак.

Другими словами, не имеет значения, является ли класс состоящим из черт или код черт «вставляется» в класс.

jk_
источник
5
Я знаю, что это год за прошедшей датой, но для будущих читателей в ruby ​​он будет использовать метод form последнего модуля, который был смешан, поэтому он будет вызывать foo () form MB
rik.vanmechelen
4
в чертах Scala могут быть поля, это означает, что они не являются «традиционными» чертами?
Серхио
4
Да, это не «традиционные», они называются «государственными» чертами. Разница между характерными чертами и
миксинами заключается в
7
Предварительно -1; То, как термины «черта» и «миксин» используются в дикой природе, крайне противоречиво, и, по крайней мере, один из пунктов здесь в основном неверен. PHP и Википедия (и, по словам @Sergio, также Scala) не согласны с вами по поводу черт, не имеющих состояния. Я не считаю этот ответ полезным, потому что он состоит из голых утверждений, и мне неясно, что это нечто большее, чем то, как вы лично используете эти слова. Чтобы убедиться в обратном, мне нужно увидеть много примеров того, как эти термины используются в реальном мире (например, в реальных языках программирования) для подтверждения ваших утверждений.
Марк Амери
3
@AykutKllic Linearization -> «Компилятор решает вопрос, что такое супер, без двусмысленности.» ( ibm.com/developerworks/library/j-jn8 )
бен,
9

Эти страницы объясняют разницу в языке программирования D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Миксины в этом контексте - это код, сгенерированный на лету, а затем вставленный в этот момент в код во время компиляции. Довольно удобно для простых DSL.

Черты - это внешние значения времени компиляции (а не код, сгенерированный из внешнего источника). Разница неуловима. Миксины добавляют логику, Черты добавляют данные, такие как информация о типе времени компиляции.

Не знаю много о Руби, но надеюсь, что это поможет.

Эйден Белл
источник
41
Миксины и черты в D полностью отличаются от того, что означают термины в компьютерной науке в целом. В D оба являются примитивами препроцессора для автоматической генерации кода. На других языках они являются механизмами наследования. Решение об именовании в D неудачно.
Tylerl