Rust语言

关注公众号 jb51net

关闭
首页 > 软件编程 > Rust语言 > Rust面向对象

Rust实现面向对象的方法

作者:微凉秋意

这篇文章主要介绍了Rust实现面向对象的方法,Rust 并不是面向对象的语言,但是面向对象的功能都可以通过自身的特点来实现,本文通过示例代码给大家详细讲解,需要的朋友可以参考下

前言

面向对象的编程语言通常实现了数据的封装继承并能基于数据调用方法。“设计模式四个小帮手”在《设计模式》中给出面向对象的定义:面向对象的程序由对象组成,对象包装了数据和操作这些数据的过程,这些过程通常被称作方法或操作。Rust 并不是面向对象的语言,但是面向对象的功能都可以通过自身的特点来实现。

1、实现封装(pub)

调用对象外部的代码无法直接访问对象内部的实现细节,唯一可以与对象进行交互的方法就是通过它公开的 API,在Rust 中使用 pub关键字来供外部访问。

封装的示例:

pub struct AveragedCollection{
    list:Vec<i32>,
    average:f64
}

impl AveragedCollection{
    pub fn add(&mut self,value:i32){
        self.list.push(value);
        self.update_average();
    }

    pub fn remove(&mut self)->Option<i32>{
        let result=self.list.pop();
        match result {
            Some(value)=>{
                self.update_average();
                Some(value)
            },
            None=>None
        }
    }

    pub fn average(&self)->f64{
        self.average
    }

    fn update_average(&mut self){
        let total:i32=self.list.iter().sum();
        self.average=total as f64 / self.list.len() as f64;
    }
}

代码解释:

由此示例可知 Rust 结构体等类型默认是私有的,相当于C++/Java中的private,而被pub修饰后相当于public,合理利用这些关键字可以做到封装的效果。

2、实现继承(trait)

继承可以使对象沿用另外一个对象的数据和行为,无需定义相关代码,代码复用效率高。Rust 中不存在继承,但是可以通过 trait 方法来实现代码共享,且可以在 trait 中覆盖定义的方法,这就相当于主流语言中的子类继承父类与重写父类方法。

2.1、为共有行为定义一个 Trait

Rust 避免将 structenum 称为对象,因为它们与impl块是分开的。

2.2、Trait 对象执行的是动态派发

2.3、Trait对象必须保证对象安全

3、实现多态(结合泛型)

继承是多态(Polymorphism)思想的实现,多态指的是编程语言可以处理多种类型数据的代码,在 Rust中使用泛型trait 约束(限定参数化多态 bounded parametric)模拟多态的使用。

有关Rust 泛型与特性的知识在本专栏前面已经介绍过,帮大家放个链接:Rust 泛型与特性

4、面向对象的设计模式

状态模式(state pattern)是一种面向对象设计模式:

Rust不仅能够实现面向对象的设计模式,还可以支持更多的模式,例如:
将状态和行为编码为类型:
Rust 类型检查系统会通过编译时错误来阻止用户使用无效的状态。

面向对象的经典模式并不总是Rust编程实践中的最佳选择,因为Rust具有所有权等其它面向对象语言没有的特性!

到此这篇关于Rust实现面向对象的方法的文章就介绍到这了,更多相关Rust面向对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文