Множественное наследование посредством смешивания классов

В предыдущем разделе было начато обсуждение темы имитации механизма наследования классов в Dojo и было указано на некоторые критические проблемы, связанные с тонкостями языка JavaScript, которые оказывают существенное влияние на разработку приложений с использованием Dojo. В первом примере было продемонстрировано простое наследование, в котором суперкласс Shape составлял основу для подкласса Circle, однако инструментальный набор Dojo обеспечивает и ограниченную форму множественного наследования.

Процесс определения отношений наследования, в которых участвуют несколько объектов Function, называется организация цепочки прототипов, потому что в языке JavaScript иерархии создаются с использованием свойства Object.prototype. (Эта концепция была продемонстрирована в примере 10.2, где отношения между классом окружности и классом фигуры определялись вручную.)

При создании иерархий простого наследования инструментарий Dojo имитирует работу механизма наследования, опираясь на концепцию организации цепочек прототипов. Однако механизм множественного наследования действует несколько иначе, потому что в языке JavaScript объект Function обладает только одним свойством prototype.


Как вы уже могли догадаться, существует несколько способов решения этой проблемы. Решение, использованное в Dojo, основано на таком применении цепочек прототипов, когда определяется единственный предок прототипа, являющийся основой для организации цепочек прототипов и в то же время позволяющий внедрять в прототип предка другие подмешиваемые классы. Проще говоря, класс может иметь только один прототип, но объекты Function, образующие эти классы, при желании можно «снабдить» любым количеством функцийконструкторов. Формально прототипы этих функцийконструкторов не будут приниматься во внимание позднее, уже в течение срока жизни объекта, но, тем не менее они могут использоваться самыми разными способами. Эти подмешиваемые классы можно представить себе как «интерфейсы, которые чтото делают» или «интерфейс + реализация».

Ниже показано, на что похоже множественное наследование в интерпретации инструментария Dojo. Единственное отличие здесь, которое наблюдается в третьем параметре функции dojo.declare, – это список вместо объекта Function. Первый элемент в этом списке является предком прототипа, а остальные – подмешиваемыми классами:


Fun with Multiple Inheritance!
type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js">

Первый предок –
//это предок прототипа, а второй (и все последующие
//функции) – это подмешиваемые классы. Обратите особое
//внимание на то, что все конструкторы суперклассов
//выполняются перед вызовом конструктора подкласса
//и в действительности нет никакого способа изменить
//такой порядок вещей.
dojo.declare("Liger", [Tiger, Lion], {
_name: null,
_species: null,
constructor : function(name) {
this._name = name;
this._species = "liger";
console.log("Created ",this._name, " the ",
this._species);
}
});
lucy = new Liger("Lucy");
console.log(lucy);
});


(body)
(/body)
.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
JavaScript – это не Java
Вызов унаследованных методов
Имитация классов с использованием средств Dojo
Наследование в JavaScript
Основной шаблон создания класса