可覆写成员
声明一个名称已存在于基组件中的属性、回调或函数,通常是一个错误:
component Base { in-out property <string> name;}
component Derived inherits Base { // error: Cannot override property 'name' declared in 'Base' in-out property <string> name;}slint
这使得向已发布的组件添加成员成为一种破坏性变更:任何已经声明了
该名称的组件都会停止编译。@shadowable 注解让基组件的作者可以选择允许被覆写,
这样此类添加就能保持向后兼容。
注意:
@shadowable是实验性的,可能会发生变化。
在基组件中的属性、回调或函数声明前加上 @shadowable:
@shadowable in-out property <string> name: "Hello";@shadowable callback activated();@shadowable public function describe() -> string { "base" }slint
继承自它的组件随后可以声明同名的成员。编译器会发出警告
('name' shadows the inherited property of the same name),但接受该声明。
这两个成员完全独立。各方继续使用自己编写时所针对的那个成员:
- 基组件内部的表达式引用基组件的成员,使用基组件的值和类型。
- 派生组件内部的表达式,以及实例化它的代码,引用覆写声明。
- 基组件的成员在派生组件中不再可访问,通过其公共 API 也无法访问。
覆写成员不必与被覆写成员匹配:类型可以不同,属性也可以覆写回调或函数。
component Base { @shadowable in-out property <string> name: "Hello"; // Always "Hello", whatever a derived component declares out property <string> greeting: "Hi, " + root.name;}
component Derived inherits Base { // Warning: 'name' shadows the inherited property of the same name in-out property <string> name: "Hey"; out property <string> own-greeting: "Yo, " + root.name;}
export component Example { d := Derived {} // "Hi, Hello" out property <string> from-base: d.greeting; // "Yo, Hey" out property <string> from-derived: d.own-greeting;}slint
private 成员在声明它的组件之外不可见,因此派生组件总是可以
声明同名的成员。这不需要注解,也不会产生警告。
component Base { private property <string> secret: "base";}
export component Derived inherits Base { // No error and no warning: Base's 'secret' is invisible here property <string> secret: "derived";}slint
@shadowable可以应用于属性、回调和函数声明。- 它写在基组件中的声明上:它表示“该成员可以被覆写”,而不是“该成员会覆写”。
- 它可以与
@deprecated以任意顺序组合,但每个注解只能出现一次。 - 派生组件中的覆写声明本身也可以标记为
@shadowable,以允许在更下层继续覆写它。 - 在同一元素上重复声明同一名称仍然是错误。
- 每个元素上都存在的保留成员,例如
x、y、width和height,不能被覆写。
© 2026 SixtyFPS GmbH