文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.3.6 子集
虽然语法相似,但非继承(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论