Мікінс проти рис


Відповіді:


214
  1. Міксини можуть містити державні (традиційні) ознаки не мають.
  2. Мікіни використовують "неявне вирішення конфлікту", риси використовують "явне вирішення конфлікту"
  3. Міксини залежать від лінеаризації, риси згладжені.

Лекція про риси

оголошення 1. У комбінаціях можна визначити змінні екземпляра. Риси цього не дозволяють. Держава повинна забезпечуватися складанням класу складання (= клас з використанням ознак)

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'
    }
}

У міксинах конфлікти в класі композиції 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. Семантика методу не залежить від того, визначений він у ознаці чи в класі, який використовує ознаку.

Іншими словами, не має значення, з якого класу складається ознаки, або код "Штату" "копіюється - вставляється" в клас.


5
Я знаю, що це дата минулого року, але для майбутніх читачів у рубіні він буде використовувати метод форми останнього модуля, який змішувався, тому він би назвав foo () форму MB
rik.vanmechelen

4
у Scala ознаки можуть мати поля, це означає, що вони не є "традиційними" ознаками?
Серхіо

4
Так, це не "традиційні", їх називають "державними" рисами. Різниця між загальнодоступними ознаками та міксинами - це пункти 2 та 3.
jk_

7
Орієнтовний -1; те, як терміни "риса" та "міксин" вживаються в дикій природі, є дуже непослідовною, і принаймні один із пунктів тут здебільшого неправильний. PHP та Вікіпедія (а за даними @Sergio, також Скала) не згодні з вами щодо того, що риси існують без громадянства. Я не вважаю цю відповідь корисною, оскільки вона складається з голих тверджень, і мені незрозуміло, що це щось більше, ніж те, як ви особисто використовуєте ці слова. Щоб переконатися в іншому, мені потрібно переглянути багато прикладів використання термінів у реальному світі (наприклад, на реальних мовах програмування) для резервного копіювання заявок.
Марк Амері

3
@AykutKllic Лінеаризація -> "Компілятор вирішує питання про те, що таке супер, без двозначності." ( ibm.com/developerworks/library/j-jn8 )
ben

9

Ці сторінки пояснюють різницю мови програмування D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Міксини в цьому контексті коду генеруються під час руху, а потім вставляються в цей момент у коді під час компіляції. Досить зручно для простих DSL.

Риси - це зовнішні значення компіляції за часом (а не код, що генерується із зовнішнього джерела). Різниця тонка. Mixins додає логіку, Traits додає такі дані, як інформація про тип компіляції.

Не знаю багато про Рубі, але сподіваюся, що це дещо допомагає.


41
Міксини та ознаки в D абсолютно не відрізняються від того, що означають терміни в загальній інформатиці. У D обидва є препроцесорними примітивами для автоматичного генерування коду. В інших мовах вони є механізмами успадкування. Рішення про іменування в D невдале.
tylerl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.