返回介绍

8.3.6 子集

发布于 2024-10-13 11:25:31 字数 1277 浏览 0 评论 0 收藏 0

虽然语法相似,但非继承(inheritance),所表达的是超集与子集。确切含义:要实现子集特征,就必须实现超集特征,反之则不然。实现超集的类型清单里,必然包含实现子集的类型。子集是对超集的进一步功能扩展,而非继承。

超集.清单 = 实现超集的类型 + 实现子集的类型。

trait Subtrait: Supertrait {}

改成约束,意思就更加明显。

trait Subtrait where Self: Supertrait {}

当然,子集扩展是相对的,也可以是一种强制要求。比如 Copy 不依赖 Clone ,也没有对其扩展,只强迫实现 Clone 特征而已。

trait Copy: Clone {}

子集可调用超集成员。

trait SuperTrait where Self: Debug {
  fn test(&self) {
    println!("{:?}", self);
  }
}

trait SubTrait: SuperTrait {
  fn hello(&self) {
    SuperTrait::test(self);
  }
}

/* ------------------------------------------------ */

impl SubTrait for i32 {} 
impl SuperTrait for i32 {}  // !!!

/* ------------------------------------------------ */

fn main() {
  let x = 123;
  x.hello();
}

既然两者之间并非继承关系,自然也就有选择歧义。

trait SuperTrait {
  fn test(&self) { println!("super"); }
}

trait SubTrait: SuperTrait {
  fn test(&self) { println!("sub"); }
}

impl SuperTrait for i32 {}
impl SubTrait for i32 {}

/* -------------------------------------------- */

fn main() {
  // 123.test();
  //   ^^^^ multiple `test` found

  SuperTrait::test(&123);
  SubTrait::test(&123);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文