cratosw

接口

接口

Rust 没有 C#/.NET 意义上的 interface,对应概念是 trait。trait 同样用于表达抽象, 其成员构成了类型实现时必须满足的契约。

和 C#/.NET 接口可包含默认方法一样,Rust trait 也可以提供默认实现。具体类型在实现 trait 时, 仍然可以覆盖为更合适或更高性能的实现。

C#/.NET 接口可包含属性、索引器、事件、方法(实例与静态)等成员。Rust trait 的成员集合较小, 常见包括实例方法、关联函数(可类比静态方法)以及常量。

除类层次外,接口还是 .NET 动态派发和多态的重要基础。Rust 也可以通过 trait object 在一定程度上 实现类似能力。trait object 本质上是由 dyn 标记的 vtable 抽象,例如 dyn ShapeShape 为 trait 名称)。trait object 总是位于指针之后:要么是引用(如 &dyn Shape), 要么是堆分配的 Box(如 Box<dyn Shape>)。

这与 .NET 中接口作为引用类型有一定相似性:值类型转换为接口时会发生装箱。但 Rust trait object 有一个重要限制:通常无法直接恢复原始具体类型。也就是说,在 .NET 中常见的接口向下转型、类型测试, 在 Rust 中默认并不直接支持(需要额外设计和支持)。

On this page