面向对象语言特性¶
一、rust是面向对象语言吗?¶
Rust在设计的时候受到各种编程范式的影响,包括面向对象。面向对象通常包含以下特性:命名对象、封装、继承。
我们所说的对象包含数据和行为,“设计模式四人帮”在《设计模式》中给出面向对象的定义如下
- 面向对象的程序由对象组成
- 对象包装了数据和操作这些数据的过程,这些过程通常被称为方法或操作
基于以上定义,rust是面向对象的。struct、enum包含数据,impl块为之提供了方法,但在rust里,带有方法的struct、enum并没有被称为对象。
二、封装¶
封装指的是:调用对象外部的代码无法直接访问对象内部的实现细节,唯一可以与对象进行交互的方法就是通过它公开的API。在rust里我们使用pub关键字来决定那些函数或方法是公开的,而默认情况下都是私有的。
三、继承¶
继承指的是:使对象可以沿用另外一个对象的数据和行为,且无需重复定义相关代码。
使用继承的其中一个原因通常是希望代码能够复用。不过rust没有继承,但在rust里我们使用默认的trait方法来实现代码的共享。因为在trait中,如果某个方法有默认实现(即默认的trait方法),那么任何实现了这个trait的类型就会自动拥有这个方法。此外,在实现trait的时候,选择覆盖trait里方法的默认实现,这就是面向对象中的子类覆盖父类方法类似。
使用继承的另一个原因是使用多态。多态是同一个行为具有多个不同表现形式或形态的能力,多态就是同一个接口,使用不同的实例而执行不同操作。换句话说就是如果一些对象拥有共同的特征,那么这个对象就可以在运行时相互替换。在rust中我们可以使用泛型来构建不同类型的抽象,并使用trait约束来决定类型必须提供的某些具体特性,这个技术有时候可以叫做限定参数多态化(bounded parametric)。
不过,现在很多编程语言都不使用继承作为内置的程序设计方案了。