我无法理解一个奇怪的行为,子类化平板电脑小部件
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
,如果编译源代码,您会得到一个行为,另一个编译构建。
这有什么问题吗?我的错误在哪里?
在 qooxdoo 中,按照约定,有受保护的和私有的 class 成员,例如方法或实例变量。受保护成员以下划线开头,如 _myProtectedMethod
,私有成员以两个下划线开头,如 __myPrivateMethod
。受保护的成员不受构建过程的影响,并保持原样。通过这种方式,它们是 override-able by derived classes.
私有成员被编译器混淆为一个随机名称,因此尝试访问私有方法或变量在定义它们的 class 之外会导致异常。
在您的 playground 示例中,您已经覆盖了方法 _onKeyPress
,该方法本身可以被覆盖,因为它是受保护的成员。
但是在覆盖的代码中,您使用的私有成员如 this.__focusedRow
失败了,因为在构建版本中不再有 __focusedRow
成员,因为它被混淆了。代码中还有更多私有成员,如 __focusedCol
、__selectionManager
等
要成功覆盖该方法,您必须用它们的访问器替换那些私有成员,例如 this.getFocusedRow()
而不是 this.__focusedRow
,this.getFocusedColum()
而不是 this._focusedCol
等。
使用 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
,如果编译源代码,您会得到一个行为,另一个编译构建。
这有什么问题吗?我的错误在哪里?
在 qooxdoo 中,按照约定,有受保护的和私有的 class 成员,例如方法或实例变量。受保护成员以下划线开头,如 _myProtectedMethod
,私有成员以两个下划线开头,如 __myPrivateMethod
。受保护的成员不受构建过程的影响,并保持原样。通过这种方式,它们是 override-able by derived classes.
私有成员被编译器混淆为一个随机名称,因此尝试访问私有方法或变量在定义它们的 class 之外会导致异常。
在您的 playground 示例中,您已经覆盖了方法 _onKeyPress
,该方法本身可以被覆盖,因为它是受保护的成员。
但是在覆盖的代码中,您使用的私有成员如 this.__focusedRow
失败了,因为在构建版本中不再有 __focusedRow
成员,因为它被混淆了。代码中还有更多私有成员,如 __focusedCol
、__selectionManager
等
要成功覆盖该方法,您必须用它们的访问器替换那些私有成员,例如 this.getFocusedRow()
而不是 this.__focusedRow
,this.getFocusedColum()
而不是 this._focusedCol
等。