Rust 面向对象编程
向下转型:在 C++ 中,多态的类型是抽象类型,我们还想把其转成实际的具体类型,在 C++ 中叫运行进实别 RTTI,需要使用像 type_id 或是 dynamic_cast 这两个技术。在 Rust 中,转型是使用 ‘as‘ 关键字,然而,这是编译时识别,不是运行时。使用 Rust 的 std::any::Any,使用 downcast_ref 来进行具体类型的转换
结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法,这样的结构体类似对象;
可以使用 pub 关键字来决定模块、类型、函数和方法是公有的,而默认情况下其他一切都是私有的,这样来实现封装;
Rust 没有继承(Inheritance),但是 Rust 代码可以使用默认 trait 方法实现来进行共享 ; // 组合优于继承
多态(Polymorphism)
很多人将多态描述为继承的同义词。不过它是一个有关可以用于多种类型的代码的更广泛的概念。对于继承来说,这些类型通常是子类(表现为子类型可以用于父类型被使用的地方)。Rust 则通过泛型来使得对多个不同类型的抽象成为可能,并通过 trait bounds 加强对这些类型所必须提供的内容的限制(可是使用 "+" 添加限制)。这有时被称为 bounded parametric polymorphism。
如果只需要同质(相同类型)集合,则倾向于使用泛型和 trait bound 而不使用 trait,因为其定义会在编译时采用具体类型进行单态化。
当使用 trait 对象时,Rust 必须使用动态分发(第一个给的啥就是啥)。动态分发也阻止编译器有选择的内联方法代码,这会相应的禁用一些优化。
// 这里的代码是泛型的,然后你还用不同的 closure 递归调用它,这个泛型的类型是无穷的……,注释里面用了 trait object,这样就不存在类型的递归推导了,trait object 是具体的类型,但是动态分发的
只有 对象安全(object safe)的 trait 才可以组成 trait 对象。