2013-02-14 3 views
0

Возможно ли создать защищенный экземпляр класса суперкласса public в подклассе с использованием аннотации JSDoc? Более конкретно, у меня есть класс, который унаследован от goog.ui.Control. goog.ui.Control имеет защищенный метод setElementInternal. Я хотел бы сделать его модификатор доступа общедоступным в подклассе для доступа к этому методу из другого класса.Google Closure JSDoc Аннотация

ответ

0

Не напрямую.

Вам нужно будет добавить новый метод в свой класс inherit, который является общедоступным, который вызывает метод @protected. Что-то вроде этого должно работать.

/** 
* My public wrapper around a protected method 
* @param {Element} element Root element for this component 
*/ 
my.namespace.Control.prototype.setElement = function(element) { 
    this.setElementInternal(element); 
} 
+1

Спасибо за ответ. Авторы Google Closure Library не используют аннотацию \ @public accessor. А именно, если не существует аннотации \ @ public, компилятор рассматривает ее как открытый метод, член и т. Д. Кроме того, я пробовал аннотацию \ @public, но на этот раз компилятор дает следующее предупреждение (ошибка из-за моих параметров компилятора). Переопределение свойства PROTECTED goog.ui.Component.prototype с собственностью PUBLIC. – user2073036

+0

Вы правы в том, что они не требуют @public. Я делаю в своем коде, чтобы прояснить мои намерения. Я удалю его из своего ответа, чтобы сделать стиль кодирования менее отвлекающим. Похоже, вы можете использовать более новую версию компилятора, чем я, которая мешает вам выполнять трюк '@ override'. – Technetium

+0

Лучше избегать использования «@public» полностью, так как это заставляет компилятор выплеснуть кучу предупреждений аннотаций, которые могут загромождать выход сборки, если вы регистрируете его или просматриваете его для ошибок/важной информации. – JoeDuncan

0

Ответ приведен ниже.

"foo.js"

goog.provide ('Foo');

...

goog.inherits (Foo, goog.ui.Control);

...

/** * @param элемент {Элемент} */

foo.prototype.setElementInternalEncap = функция (элемент) {

goog.bind (это. setElementInternal, this, element);

};

"bar.js"

goog.provide ('бар');

goog.require ('foo');

...

fooReference.setElementInternalEncap (элемент);

+0

Это не сработает. 'goog.bind (...)' возвращает функцию, и возвращенная функция не выполняется. Это по существу не-op. Технически вы можете вместо этого заменить свой текущий оператор goog.bind (...) 'следующим образом:' goog.bind (this.setElementInternal, this, element)(); '. Тем не менее, это полностью побеждает цель вызова 'goog.bind() 'для начала. – Technetium