Когда следует предпочитать шаблоны наследования миксинам в динамических языках?
Под миксинами я имею в виду собственно правильное микширование, как при вставке функций и элементов данных в объект во время выполнения.
Когда бы вы использовали, например, наследование прототипа вместо миксинов? Чтобы проиллюстрировать, что я имею в виду под mixin, приведем псевдокод:
asCircle(obj) {
obj.radius = 0
obj.area = function() {
return this.radius * this.radius * 3.14
}
myObject = {}
asCircle(myObject)
myObject.area() // -> 0
javascript
inheritance
mixins
Магнус Вольффелт
источник
источник
Ответы:
Прототип наследования прост. У него есть одно преимущество перед миксинами.
Это то, что это живая ссылка. если вы измените прототип, все, что наследует его, изменится.
Пример использования pd
В общем, если вы хотите, чтобы изменения в круге «interface» отражали во время выполнения все объекты, которые «используют» его функциональность, то наследуйте от него.
Если вы не хотите, чтобы изменения отражали, смешайте их.
Обратите внимание, что миксины также имеют большее назначение. Миксины - это ваш механизм множественного «наследования».
Если вы хотите, чтобы объект для реализации несколько «интерфейсов» , то вы будете должны смешивать некоторые в. Тот , который вы используете для прототипа наследования является тот , который вы хотите изменения , чтобы отразить на время выполнения, другие будут смешаны в.
источник
Мое чувство лошади говорит мне это:
Связанные заметки:
источник
Используйте тест "Is-a".
Наследование ограничено случаем, когда вы можете сказать «Подкласс - это Суперкласс». Они такие же вещи. «Сыр - молочный продукт».
Mixins для всего остального. «Сыр можно использовать в бутерброде». Сыр не бутерброд, но он участвует в бутерброде.
PS. Это не имеет ничего общего с динамическими языками. Любой язык множественного наследования со статической компиляцией (т. Е. C ++) имеет ту же точку принятия решения.
источник
Что ж, лучший пример, который я могу вам дать, - это актер для игры, который имеет наследство для некоторых базовых вещей, но использует миксины / плагины для общей функциональности. Общая функциональность может быть (прямо из исходного кода!):
источник