我无法理解一个奇怪的行为,子类化平板电脑小部件

I can't understand a weird behavior, subclassing tablet widget

使用 qooxdoo 5.0.2(或以前的版本)我将 tablet 小部件子类化并覆盖 _onKeyPress 方法。 然后,生成源代码我得到了正确的行为,但是生成构建的行为是不同的。

我用下面这个例子简化了我的问题。 我将 table 小部件子类化并使用来自 qooxdoo 5.0.2 table 小部件源的相同代码覆盖 _onKeyPress 方法。 运行 示例,编辑一个单元格,然后按回车键。

正在使用

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

这种行为很糟糕。 使用

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

行为正确。

如果您将示例放在一个空白的 5.0.2 项目中,使用 qx.ui.table.TableModified,如果编译源代码,您会得到一个行为,另一个编译构建。

这有什么问题吗?我的错误在哪里?

Playground example

在 qooxdoo 中,按照约定,有受保护的和私有的 class 成员,例如方法或实例变量。受保护成员以下划线开头,如 _myProtectedMethod,私有成员以两个下划线开头,如 __myPrivateMethod。受保护的成员不受构建过程的影响,并保持原样。通过这种方式,它们是 override-able by derived classes.

私有成员被编译器混淆为一个随机名称,因此尝试访问私有方法或变量在定义它们的 class 之外会导致异常。

在您的 playground 示例中,您已经覆盖了方法 _onKeyPress,该方法本身可以被覆盖,因为它是受保护的成员。

但是在覆盖的代码中,您使用的私有成员如 this.__focusedRow 失败了,因为在构建版本中不再有 __focusedRow 成员,因为它被混淆了。代码中还有更多私有成员,如 __focusedCol__selectionManager

要成功覆盖该方法,您必须用它们的访问器替换那些私有成员,例如 this.getFocusedRow() 而不是 this.__focusedRowthis.getFocusedColum() 而不是 this._focusedCol 等。