目录

  1. 什么是 Rust 面向对象
  2. 为什么要使用面向对象
  3. Rust 中的面向对象特性
  4. 封装与数据隐藏
  5. 继承与多态的替代
  6. 代码示例
  7. 参考资料与出站链接

什么是 Rust 面向对象

Rust 面向对象是指在 Rust 中实现类似传统面向对象编程 (OOP) 的概念,如封装、继承和多态。尽管 Rust 不是典型的 OOP 语言,它通过结构体、特性 (traits) 和所有权系统提供了灵活的替代方案。


为什么要使用面向对象

  • 代码组织:将数据和行为绑定,提高可读性。
  • 复用性:通过特性共享行为。
  • 抽象性:隐藏实现细节,提供通用接口。
  • 模块化:便于维护和扩展。

Rust 中的面向对象特性

  • 结构体 (Struct):定义数据。
  • 特性 (Traits):定义行为,类似接口。
  • 实现 (Impl):为结构体绑定方法。
  • 所有权:管理数据生命周期。

封装与数据隐藏

  • 封装:将数据和方法组合在结构体中。
  • 数据隐藏
  • 默认字段私有。
  • 使用 pub 控制可见性。
struct Counter {
    count: i32,  // 私有字段
}

impl Counter {
    pub fn new() -> Counter {  // 公开构造函数
        Counter { count: 0 }
    }
    pub fn increment(&mut self) {  // 公开方法
        self.count += 1;
    }
}

继承与多态的替代

  • 继承
  • Rust 不支持传统继承。
  • 替代:特性组合或结构体嵌套。
  • 多态
  • 使用特性对象 (dyn Trait) 或泛型。
  • dyn Trait:动态分发。
  • 泛型:静态分发。
trait Shape {
    fn area(&self) -> f64;
}

代码示例

封装示例

struct User {
    name: String,  // 私有
    age: u32,      // 私有
}

impl User {
    pub fn new(name: &str, age: u32) -> User {
        User { name: String::from(name), age }
    }
    pub fn get_name(&self) -> &str {
        &self.name
    }
}

fn main() {
    let user = User::new("Alice", 30);
    println!("Name: {}", user.get_name());
}

运行结果:

Name: Alice

特性与多态

trait Animal {
    fn speak(&self) -> String;
}

struct Dog;
struct Cat;

impl Animal for Dog {
    fn speak(&self) -> String {
        String::from("Woof!")
    }
}

impl Animal for Cat {
    fn speak(&self) -> String {
        String::from("Meow!")
    }
}

fn make_sound(animal: &dyn Animal) {
    println!("{}", animal.speak());
}

fn main() {
    let dog = Dog;
    let cat = Cat;
    make_sound(&dog);
    make_sound(&cat);
}

运行结果:

Woof!
Meow!

泛型多态

trait Printable {
    fn print(&self);
}

struct Item<T> {
    value: T,
}

impl<T: Printable> Item<T> {
    fn display(&self) {
        self.value.print();
    }
}

struct Number(i32);

impl Printable for Number {
    fn print(&self) {
        println!("Number: {}", self.0);
    }
}

fn main() {
    let item = Item { value: Number(42) };
    item.display();
}

运行结果:

Number: 42

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 社区支持