Skip to content

可覆写成员

声明一个名称已存在于基组件中的属性、回调或函数,通常是一个错误:

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