Многоуровневое наследование с использованием закрытия Google

Я хочу реализовать множественное наследование с помощью закрытия Google. Я уже провел исследование и нашел эту книгу. На странице 158 говорится, что закрытие Google не поддерживает множественное наследование, но есть другие способы сделать это, например, с помощью «goog.mixin». Я пробовал, но получаю "Uncaught AssertionError: Failure".

В принципе, я хочу сделать что-то вроде этого:

class A {
    function moveLeft() {
        ...
    },
    function moveRight() {
        ...
    }
}

class B extends A {
    function moveTop() {
        ...
    }
}

class C extends B {
    function moveBottom() {
        ...
    }
}
  • Класс A имеет методы «moveLeft» и «moveRight».
  • Класс B имеет методы «moveLeft», «moveRight» И «moveTop» (обычное наследование, получает методы из родительского класса A)
  • Класс C должен иметь методы "moveLeft", "moveRight", "moveTop" И "moveBottom" (двойное наследование, получение методов из родительского класса B и родительского класса A)

НО класс C получает только методы класса B так, как это делаю я.

Как я могу сделать это, используя закрытие Google?

Спасибо.

João


ИЗМЕНИТЬ 1

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

// external file xgis.js

xgis = {};


// xgis.map
xgis.map = function(options) {
    // map definitions ...
};
// Inherits from ol.Map
goog.inherits(xgis.map, ol.Map);


// xgis.layer
xgis.layer = function(options) {
    // base layer definitions
};


// xgis.layer.osm
xgis.layer.osm = function(options) {
    goog.base(this, {
        source: new ol.source.OSM()
    });
    sigga.layer.call(this, options);
};
// Inherits from ol.layer.Tile
goog.inherits(xgis.layer.osm, ol.layer.Tile);
/**
 * Copies all the members of a source object to a target object.
 * i.e, inherits ALSO from xgis.layer (the base layer class)
 */
goog.mixin(xgis.layer.osm.prototype, xgis.layer.prototype);

Цель состоит в том, чтобы создать SDK, который я назвал здесь «xgis». Мы хотим построить наш API поверх OpenLayers 3 (ol3). Мы хотим, чтобы наши собственные методы использовали методы ol3. Нам нужен собственный метод документирования.

Например, я хочу, чтобы мой собственный метод проверял видимость слоя. Но этот метод должен использовать метод из ol3 «с таким же именем, как у меня»:

// My method
xgis.layer.prototype.getVisible = function() {
    // Used the method of the parent class from ol3
    return this.superClass_.getVisible();
};

Я попытался использовать ключевое слово «superClass_», чтобы получить метод родительского класса, но это не сработало.

Есть ли другой способ?


person joaorodr84    schedule 22.05.2014    source источник
comment
Несколько вещей, которые помогут прояснить ситуацию: 1) какой сбой вы видите (время сборки, время выполнения)? 2) на каком объекте определен getVisible 3) как он определен? - Убедитесь, что xgis.layer.osm объявлен как конструктор - Убедитесь, что xgis объявлен как const - Убедитесь, что xgis.lay является либо константой, либо конструктором в зависимости от ситуации   -  person John    schedule 27.05.2014
comment
Привет, Джон. Прежде всего, спасибо за ваш ответ. Я постараюсь прояснить ситуацию. ... 1) мой собственный xgis.layer.prototype.getVisible() не может быть определен, потому что у меня уже есть метод getVisible от родителя (поскольку xgis.layer наследует его от ol.layer.Tile) ... 2 ) Внутренний getVisible происходит от ol.layer.Tile; мой собственный xgis.layer.prototype.getVisible не может быть определен, как я сказал в (1). Я хочу, чтобы мой getVisible был определен в xgis.layer! ... 3) Я не очень понимаю, что вы имеете в виду, но я намерен определить getVisible как прототип из класса xgis.layer. ... Спасибо еще раз.   -  person joaorodr84    schedule 27.05.2014


Ответы (1)


Можете ли вы написать свой пример как действительный JavaScript? Насколько я могу судить, это не «множественное наследование», а просто несколько уровней наследования.

Я думаю, вы имеете в виду:

function A() {}
A.prototype.moveLeft = function() {};

function B() {}
goog.inherits(B, A);
A.prototype.moveTop = function() {};

function C() {}
goog.inherits(C, B);
A.prototype.moveBottom = function() {};
person John    schedule 25.05.2014
comment
Привет Джон. Я добавил немного кода JavaScript в надежде, что вы сможете предложить дополнительную помощь. Проверьте РЕДАКТИРОВАТЬ 1, пожалуйста. Спасибо. :) - person joaorodr84; 26.05.2014
comment
с goog.mixin система типов его не понимает, хотя оптимизация должна быть в порядке. Однако для superClass_ может быть только одно значение, поэтому вам нужно явно вызвать суперкласс: ol.layer.Tile.prototype.getVisible.call(this) - person John; 03.06.2014