35 lines
2.4 KiB
Plaintext
35 lines
2.4 KiB
Plaintext
// 构造器分段示例:原生可选参数/可变子项与源子类新增字段分别验证。
|
|
// 省略 RectBlock 的 radius/color 不应使字符串 tag 被错当成原生颜色参数。
|
|
// 在原生矩形后增加 tag 字段;位置构造仍保留 width/height 及可选圆角/颜色规则。
|
|
class TaggedRect: RectBlock { tag: String }
|
|
// 在可变数量 Block 子项之后接收源 tag,子项列表与字段不混用。
|
|
class TaggedColumn: Column { tag: String }
|
|
// 保留原生事件 kind,再追加业务字符串字段。
|
|
class TaggedEvent: Event { tag: String }
|
|
// 原生列表成员之后追加 tag,列表元素仍可保存不同托管类型。
|
|
class TaggedList: ObjectList { tag: String }
|
|
// 将需要更新的矩形作为强业务引用保存,按钮回调只修改它的颜色。
|
|
class Actions {
|
|
// 字段保存 TaggedRect 的对象引用,recolor 的写入会被当前页面中该对象的绘制读取观察到。
|
|
rect: TaggedRect
|
|
// 写原对象的 color,挂载显示由依赖跟踪刷新,不需要重新构造整个页面。
|
|
// 由下面 Button.onClick 注册为零参绑定方法;不接收 Event,也不修改 tag。
|
|
function recolor(self: Actions): Unit { self.rect.color = "#237A45" }
|
|
}
|
|
// 这里刻意省略原生可选项,用末尾字符串初始化子类字段;后面的列表/Column 做对应可变参数演示。
|
|
rect = TaggedRect(180, 60, "省略 radius/color 后的字段")
|
|
// kind 是原生 Event 参数,第二个字符串才是 TaggedEvent 的源字段 tag。
|
|
event = TaggedEvent("click", "事件字段")
|
|
// 前两个托管对象归入原生 ObjectList 成员,末尾字符串留给子类字段,不作为第三个列表成员。
|
|
// TaggedList.tag 是该列表实例的业务字段;它既不改变 items.count,也不会参与 rect 的容器布局。
|
|
items = TaggedList(rect, event, "列表成员之后的字段")
|
|
actions = Actions(rect)
|
|
button = Button("调用原对象方法")
|
|
// 这里只注册回调,不立即执行 recolor,因此首次显示仍使用矩形原生构造的默认颜色。
|
|
button.onClick(actions.recolor)
|
|
// Column 原生参数接收 padding/gap 和视觉孩子;末尾 tag 字符串不参与布局,textOf 则读取各对象的 tag。
|
|
root = TaggedColumn(24, 16, TextBlock("原生选项与子类字段分别检查", 2), rect, ui.textOf(rect, "tag"), ui.textOf(event, "tag"), ui.textOf(items, "tag"), button, "可变子项之后的字段")
|
|
page = Page()
|
|
page.title = "构造器契约"
|
|
page.render(root)
|