Я бы сказал, что в языках, которые поддерживают миксины, это практически то же самое, что использование (множественного) наследования. В обоих случаях для рассматриваемого класса / объекта существуют одни и те же методы / свойства, и оба они вызываются одинаково - практического различия нет. Я также предполагаю, что на этом гипотетическом языке вы также можете «расширяться» от нескольких «классов».
Если это все верно, то в некотором смысле они эквивалентны, и вопрос не имеет смысла - ни один не лучше, чем другие, потому что они эквивалентны по функциональности.
С точки зрения человеческого понимания, я думаю, что большинство людей думают о наследовании с точки зрения отношения isA
и смешивают с точки зрения украшения чего-либо с помощью функциональности.
Если вы можете наследовать только от одного «класса», то, очевидно, миксины - это способ получить множественное наследование.
РЕДАКТИРОВАТЬ - основываясь на ваших комментариях, которые хороши, я бы сказал, детали гипотетического языка имеют значение. Я признаю, что я основываю свой ответ на Sproutcore, который является фреймворком Javascript, который формализовал поддержку как миксинов, так и наследования. В СЦ вы можете сделать
App.MyObject = SC.Object.extend({
prop: 'prop',
func: function(){
})
, который делает то, что вы ожидаете, он помещает prop
и func
в прототип MyObject
, создавая "класс", который может иметь подклассы. Вы также можете сделать
App.MyObject = SC.Object.extend(App.OtherObject, {
// stuff
})
, который делает множественное наследование. Тогда вы можете получить что-то вроде
CommonFunctionality = {
// some methods
};
App.mixin(CommonFunctionality);
, который применил бы CommonFunctionality
к 1023 *. Если бы приложение было пространством имен (то есть a {}
), методы CommonFunctionality
были бы применены к этому литералу объекта. Если бы это имело смысл, вы могли бы также применить CommonFunctionality
к «классу», и его методы были бы в прототипе. Если вы посмотрите в источнике, вы увидите
SC.extend = SC.mixin ;
Так что в SC нет абсолютно никакой разницы, потому что это один и тот же метод.
Так что детали имеют значение - они не должны были делать это таким образом, но они сделали, и есть последствия. Если бы они сделали это по-другому, то, конечно, последствия были бы другими.