mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2026-08-19 04:33:27 +08:00
Updated 'src/oop/trait_objects.md'.
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
|
||||
## 为共同行为定义特质
|
||||
|
||||
为了实现咱们想要 `gui` 所拥有的行为,咱们将定义将有着一个名为 `draw` 方法的名为 `Draw` 特质。随后咱们就可以定义取 *特质对象,a trait object* 的一个矢量。特质对象会同时指向实现了这个指定特质的某个类型,以及用于在运行时查找那个类型上特质方法的一张表。咱们是通过指定某种指针,比如某个 `&` 的引用,或某个 `Box<T>` 的灵巧指针,接着便是 `dyn` 关键字,以及随后指明相关特质,创建出特质对象。(在第 19 章的 [“动态大小类型与 `Sized` 特质”](Ch19_Advanced_Features.md#动态大小的类型与-sized-特质) 小节咱们将讲到特质对象必须使用指针的原因。)在泛型或具体类型处,咱们就可以使用特质对象。而不论在何处使用特质对象,Rust 的类型系统都会确保在编译时,在那样的上下文中的任何值,都将实现该特质对象的特质。于是,咱们就无需掌握编译时的所有可能类型了。
|
||||
为了实现我们希望 `gui` 具有的行为,我们将定义一个名为 `Draw` 的特质,他将有个名为 `draw` 方法。然后,我们可以定义一个取特质对象的矢量值。所谓 *特质对象*,既指向实现我们指定特质的类型的实例,也指向用于在运行时查找该类型上特质方法的数据表。我们通过指定某种指针,比如引用或 `Box<T>` 灵巧指针,接着是 `dyn` 关键字,然后指定相关特质创建特质对象。(我们将第 20 章中 [动态大小类型与 `Sized` 特质](../advanced_features/adv_types.md#动态大小的类型与-sized-特质) 小节中,讨论特质对象必须使用指针的原因。)我们可以使用特质对象来代替泛型或具体类型。无论我们在何处使用特质对象,Rust 的类型系统都会在编译时确保该上下文中使用的任何值,都将实现该特质对象的特质。因此,我们不需要在编译时就了解所有可能类型。
|
||||
|
||||
|
||||
咱们已经提到过,在 Rust 中,咱们避免将结构体与枚举称为 “对象”,是为了将二者与其他语言中的对象区别开来。在结构体或枚举中,结构体字段中的数据,与 `impl` 代码块中的行为是分开的,而在其他语言中,数据与行为被结合为通常被标称为对象的这么一个概念。然而,特质对象由于其结合了数据与行为,而 *真的* 更像其他语言中的对象。但从无法添加数据到特质对象上看,特质对象是不同于传统的对象的。特质对象并不如其他语言中的对象那样普遍的有用:其特定用途为实现共用行为的抽象。
|
||||
|
||||
Reference in New Issue
Block a user