2015-04-22 1 views
0

У меня есть объект, который наследует объект из 2 других объектов.Вызов суперкласса класса при множественном наследовании в DOJO

Я использую вручную вызвать для конструктора, потому что я хочу, чтобы манипулировать параметрами я посылаю супер классов (см '-chains-')

define([...], function(...) { 
    return declare("myClass", [base1, base2], 
    { 
     "-chains-": 
    { 
     constructor: "manual" 
    }, 

    constructor: function (params) { 
     this.inherited(arguments, [ params.x, params.y, ... ]); // just for the example 
    } 
    }); 
}); 

Проблема заключается в том, что я делаю что-то здесь не так с синтаксисом потому что мои супер классы-конструкторы вообще не вызываются.

Когда я удаляю -chains- и this.inherited... вызываются конструкторы суперклассов, но без манипуляций с параметрами.

Найдено Обход

Вместо this.inherited(...) в myClass конструктор мы пишем

base1.prototype.constructor.apply(this, [paramsForBase1]); 
base2.prototype.constructor.apply(this, [paramsForBase2]); 

Но все-таки рад услышать то, как Dojo

ответ

0

Там нет Dojo, как я боюсь. Основным преимуществом автоматического наследования конструктора является то, что он вызовет все конструкторы.

Однако, если вы установите его в руководство, то оно будет только вызова конструктора последнего унаследованного класса в списке. В вашем случае будет вызываться конструктор base2, но не один из base1.

Причина этого заключается в том, что в конце концов, ваш класс может иметь только один метод каждого вида, так что если и base1 и base2 имеют один и тот же метод, то он будет перекрывать их в том же порядке, который вы указали массив наследования. Это означает, что он сначала будет содержать , а на следующем шаге он будет переопределен base2.constructor.


EDIT:

Если вы не хотите, чтобы вручную вызвать конструкторы всех базовых классов самостоятельно, вы можете создать цикл. Все базовые конструкторы фактически доступны в метаобъекте. Это немного Hacky, но this.constructor._meta.parents обеспечивает массив всех конструкторов, так что вы можете просто цикл над ним, например:

var inheritAllConstructors = function(object, arguments) { 
    for (var idx = 0; idx < object.constructor._meta.parents.length; idx++) { 
     object.constructor._meta.parents[idx].apply(object, arguments); 
    } 
}; 

И тогда вы можете использовать его как это:

constructor: function(name) { 
    inheritAllConstructors(this, ["custom", "arguments"]); 
}, 

Полный пример можно найти на JSFiddle: http://jsfiddle.net/n7wnvbu1/

+0

Звучит безупречно. Спасибо. Обходным решением является: –

+0

Если вы не хотите вручную вызывать все конструкторы, есть еще способ получить массив всех родителей и перебрать их через 'this.constructor._meta.parents'. Это все еще немного повторное использование. Я отредактировал свой ответ с дополнительной информацией. – g00glen00b

+1

Да, я перебрался в додзё и увидел этих участников. Но мне не нравится использовать необъявленных членов любой библиотеки для случая, что в один прекрасный день они изменят/удаляют его с более новыми версиями, а затем мне придется иметь дело с снова.Но большое вам спасибо, вы очень помогли –