Я не могу понять странное поведение, подкласс виджет планшета

Используя qooxdoo 5.0.2 (или предыдущую версию), я создаю подкласс виджета планшета и переопределяю _onKeyPress метод. Затем при генерации исходного кода я получаю правильное поведение, но при генерации сборки поведение отличается.

Я упростил свой вопрос с помощью этого примера ниже. Я подкласс виджет таблицы и переопределить _onKeyPress метод С ТО ЖЕ КОДОМ из источника виджета таблицы qooxdoo 5.0.2. Запустите пример, отредактируйте ячейку и нажмите Enter.

С помощью

var tbl = new qx.ui.table.TableModified(tableModel)

поведение плохое С помощью

var tbl = new qx.ui.table.Table(tableModel)

поведение правильное.

Если вы поместите пример в пустой проект 5.0.2, используя qx.ui.table.TableModifiedВы получаете поведение, если компилируете исходный код, и другое с компилируемой сборкой.

Что не так с этим? Где моя ошибка?

Пример детской площадки

1 ответ

Решение

В qooxdoo, по соглашению, есть защищенные и закрытые члены класса, такие как методы или переменные экземпляра. Защищенные участники начинаются с символа подчеркивания _myProtectedMethodчастные члены начинаются с двух подчеркиваний, таких как __myPrivateMethod, На защищенные элементы не влияет процесс сборки, и они остаются без изменений. Таким образом, они могут быть переопределены производными классами.

Закрытые члены скрываются компилятором в случайное имя, поэтому попытка доступа к закрытому методу или переменной вне класса, в котором они определены, приводит к исключению.

На примере игровой площадки вы переопределили метод _onKeyPress который сам по себе может быть отменен, поскольку он является защищенным членом.

Но в переопределенном коде вы используете частные члены, такие как this.__focusedRow который терпит неудачу, потому что в версии сборки больше нет __focusedRow член как то запутался. В коде больше закрытых членов, таких как __focusedCol, __selectionManager и т.п.

Чтобы успешно переопределить метод, вы должны заменить эти закрытые элементы их средствами доступа, например this.getFocusedRow() вместо this.__focusedRow, this.getFocusedColum() вместо this._focusedCol и т.п.

Другие вопросы по тегам