mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-09 00:43:59 +08:00
fixed CH17-01
This commit is contained in:
parent
93b41bc9d9
commit
0b365c0373
@ -4,7 +4,7 @@
|
||||
> <br>
|
||||
> commit 2a9b2a1b019ad6d4832ff3e56fbcba5be68b250e
|
||||
|
||||
关于一门语言是否需要是面向对象,在编程社区内并未达成一致意见。Rust 被很多不同的编程模式影响,我们探索了十三章提到的函数式编程的特性。面向对象编程语言的一些特性往往是对象、封装和继承。我们看一下这每一个概念的含义以及 Rust 是否支持他们。
|
||||
关于一门语言是否需要是面向对象,在编程社区内并未达成一致意见。Rust 被很多不同的编程范式影响,我们探索了十三章提到的函数式编程的特性。面向对象编程语言的一些特性往往是对象、封装和继承。我们看一下这每一个概念的含义以及 Rust 是否支持他们。
|
||||
|
||||
## 对象包含数据和行为
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
> data and the procedures that operate on that data. The procedures are
|
||||
> typically called *methods* or *operations*.
|
||||
>
|
||||
> 面向对象的程序是由对象组成的。一个**对象**包数据和操作这些数据的过程。这些过程通常被称为**方法**或**操作**。
|
||||
> 面向对象的程序是由对象组成的。一个**对象**包含数据和操作这些数据的过程。这些过程通常被称为**方法**或**操作**。
|
||||
|
||||
在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被**称为**对象,但是他们提供了与对象相同的功能,参考 Gang of Four 所定义的对象。
|
||||
|
||||
@ -96,8 +96,8 @@ impl AveragedCollection {
|
||||
|
||||
<!-- PROD: END BOX -->
|
||||
|
||||
为了支持这种模式,Rust 有 **trait 对象**(*trait objects*),这样我们可以指定给任何类型的值,只要值实现了一种特定的 trait。
|
||||
为了支持这种模式,Rust 有 **trait 对象**(*trait objects*),这样我们也可以指明接受任意类型的值,只要这个值实现了一种特定的 trait。
|
||||
|
||||
继承最近在很多编程语言的设计方案中失宠了。使用继承来实现代码重用需要共享比你需要共享的代码。子类不应该总是共享它们的父类的所有特色,但是继承意味着子类得到了它父类所有的数据和行为。这使得程序的设计更加不灵活,并产生了无意义的方法调用或子类,或者由于方法并不适用于子类不过必需从父类继承而造成错误的可能性。另外,一些语言只允许子类继承一个父类,这进一步限制了程序设计的灵活性。
|
||||
继承最近在很多编程语言的设计方案中失宠了。使用继承来实现代码重用,会共享比实际需要更多的代码。子类不应该总是共享它们的父类的所有特性,但是继承意味着子类得到了它父类所有的数据和行为。这使得程序的设计更加不灵活,并产生了无意义的方法调用或子类,或者由于方法并不适用于子类,但必需从父类继承而造成错误的可能性。另外,一些语言只允许子类继承一个父类,这进一步限制了程序设计的灵活性。
|
||||
|
||||
因为这些原因,Rust 选择了一个另外的途径,使用 trait 对象替代继承。让我们看一下在 Rust 中 trait 对象是如何实现多态的。
|
||||
|
Loading…
Reference in New Issue
Block a user