38 lines
1.7 KiB
Plaintext
38 lines
1.7 KiB
Plaintext
// 普通源类继承示例:GUI 点击执行继承的 activate,内部 self.change 再动态分派到 DemoCounter 覆盖。
|
|
// 两个 textOf 共享同一模型字段,修改一次业务值会更新两个展示位置。
|
|
// 定义业务状态和公共事件入口,Number/String 字段在构造与赋值时按声明契约检查。
|
|
class Counter {
|
|
value: Number
|
|
lastEvent: String
|
|
|
|
// 保存实际事件种类,再通过 self 调用可覆盖的方法;接收者保持具体子类身份。
|
|
function activate(self: Counter, event: Event): Unit {
|
|
self.lastEvent = event.kind
|
|
self.change()
|
|
}
|
|
|
|
// 基类默认行为把值置为 10,子类可复用入口并替换这部分策略。
|
|
function change(self: Counter): Unit {
|
|
self.value = 10
|
|
}
|
|
}
|
|
|
|
// 继承 Counter 的字段与 activate,仅替换 change;构造参数仍按继承字段顺序传入。
|
|
class DemoCounter: Counter {
|
|
// 覆盖把值设为 12,演示从继承方法内部发起的调用也会选中实际接收者的方法。
|
|
function change(self: DemoCounter): Unit {
|
|
self.value = 12
|
|
}
|
|
}
|
|
|
|
// 创建唯一模型,之后所有绑定和按钮回调都指向它,无需把 GUI 状态复制到另一份存储。
|
|
model = DemoCounter(9, "等待点击")
|
|
first = ui.textOf(model, "value", 2)
|
|
second = ui.textOf(model, "value", 2)
|
|
eventName = ui.textOf(model, "lastEvent")
|
|
button = Button("调用继承方法,再分派到覆盖方法")
|
|
// 注册绑定方法,运行时将 click 的 Event 传给 activate;最后 Page.render 才把对象树显示出来。
|
|
button.onClick(model.activate)
|
|
page = Page()
|
|
page.render(Column(24, 16, TextBlock("Endor class:继承、self 与动态方法分派", 2), Row(0, 16, first, second), button, eventName))
|