Cách triển khai các khái niệm lập trình hướng đối tượng trong Rust

Lập trình hướng đối tượng (OOP) đơn giản hóa thiết kế phần mềm bằng cách nhấn mạnh việc sử dụng các đối tượng để biểu diễn các thực thể và khái niệm trong thế giới thực. OOP khuyến khích khả năng bảo trì bằng cách đóng gói chức năng trong các đối tượng.


Rust là một ngôn ngữ linh hoạt hỗ trợ lập trình chức năng và thủ tục. Mặc dù nó không hỗ trợ lập trình hướng đối tượng một cách nguyên bản, nhưng bạn có thể triển khai các khái niệm OOP bằng cách sử dụng các kiểu dữ liệu tích hợp sẵn của Rust.


Đóng gói trong Rust

Tính đóng gói đòi hỏi phải tổ chức mã thành các đơn vị độc lập ẩn các chi tiết bên trong trong khi hiển thị giao diện công khai cho tương tác bên ngoài để giảm thiểu độ phức tạp và cải thiện khả năng bảo trì mã.

Bạn có thể đóng gói mã Rust bằng các mô-đun. Một mô-đun là một tập hợp các mục bao gồm các hàm, cấu trúc, enum và hằng số. Mô-đun Rust cung cấp chức năng nhóm và xác định ranh giới giữa các phần của chương trình.

Sử dụng các mô-đun để đóng gói dữ liệu và chức năng

Bạn có thể xác định một mô-đun bằng cách sử dụng chế độ từ khóa theo sau bởi một tên:

 mod my_module {
    
}

Bạn có thể tổ chức các mô-đun theo thứ bậc bằng cách lồng các khai báo của chúng vào nhau:

 mod parent_module {
    mod my_module {
        
    }
}

Sau đó, bạn có thể tham khảo các mô-đun lồng nhau với hệ thống phân cấp đầy đủ, phân tách từng mô-đun bằng dấu hai chấm, ví dụ: parent_module::my_module.

Theo mặc định, các mục trong mô-đun là riêng tư và chỉ có thể truy cập mã trong cùng một mô-đun. Nhưng bạn có thể công khai các mô-đun bằng cách sử dụng quán rượu từ khóa:

 mod my_module {
    pub fn my_function() {
        
    }
}

Sau đó bạn có thể truy cập my_function từ các phần khác của chương trình của bạn.

Sử dụng Đặc điểm để Xác định Hành vi

Một cách khác mà Rust cho phép đóng gói là thông qua việc sử dụng các đặc điểm. Các đặc điểm xác định các hành vi mà các loại có thể thực hiện và đảm bảo rằng các loại khác nhau tuân theo cùng một giao diện.

 pub trait Printable {
    fn print(&self);
}
pub struct MyType {
    
}


impl Printable for MyType {
    fn print(&self) {
        
    }
}


Các Có thể in đặc điểm có một in phương pháp và Kiểu của tôi cấu trúc thực hiện Có thể in đặc điểm bằng cách thực hiện các in phương pháp.

Sử dụng các đặc điểm, bạn có thể đảm bảo rằng bất kỳ loại nào thực hiện Có thể in đặc điểm có một in phương pháp. Điều này rất hữu ích khi làm việc với mã chung cần tương tác với các loại khác nhau có chung một hành vi.

Kế thừa trong Rust

Tính kế thừa cho phép bạn định nghĩa một lớp dựa trên một lớp khác. Lớp con sẽ kế thừa các thuộc tính và phương thức của lớp cha của nó.

Trong Rust, bạn được khuyến khích sử dụng bố cục thay vì kế thừa. Bố cục là một quá trình tạo các đối tượng mới bằng cách kết hợp các đối tượng hiện có. Thay vì tạo một lớp mới kế thừa chức năng từ lớp cơ sở, bạn có thể tạo một cấu trúc mới chứa một thể hiện của cấu trúc cơ sở và các trường của nó.

Tạo các loại mới bằng cách kết hợp các loại hiện có

Bạn sẽ sử dụng enum và cấu trúc để tạo các kiểu mới. Enums rất hữu ích cho các loại có giá trị hữu hạn và các cấu trúc có thể chứa nhiều trường.

Bạn có thể tạo một loại enum cho các loại động vật khác nhau.

 enum Animal {
    Cat,
    Dog,
    Bird,
    
}

Ngoài ra, bạn có thể tạo một cấu trúc chứa các trường cho từng loại động vật. Cấu trúc có thể chứa enum và các loại khác.

 struct Animal {
    name: String,
    age: u8,
    animal_type: AnimalType,
}
enum AnimalType {
    Cat,
    Dog,
    Bird,
    
}


Các Động vật struct giữ các giá trị của Loại động vật kiểu liệt kê.

Bạn có thể sử dụng các đặc điểm để thực hiện kế thừa và thêm hành vi vào một loại mà không cần tạo một loại mới.

 trait Fly {
    fn fly(&self);
}

Đây là cách bạn có thể thực hiện Bay đặc điểm cho nhiều loại.

 struct Bird {
    name: String,
    wingspan: f32,
}
impl Fly for Bird {
    fn fly(&self) {
        println!("{} is flying!", self.name);
    }
}


struct Plane {
    model: String,
    max_speed: u32,
}


impl Fly for Plane {
    fn fly(&self) {
        println!("{} is flying!", self.model);
    }
}


Các ChimMáy bay cấu trúc thực hiện Bay đặc điểm và in chuỗi với In! vĩ mô.

Bạn có thể gọi bay method trên cả hai cấu trúc mà không biết loại cụ thể của chúng.

 fn main() {
    let bird = Bird {
        name: String::from("Eagle"),
        wingspan: 2.0,
    };
    let plane = Plane {
        model: String::from("Boeing 747"),
        max_speed: 900,
    };


    let flying_objects: Vec<&dyn Fly> = vec![&bird, &plane];


    for object in flying_objects {
        object.fly();
    }
}


Các chủ yếu chức năng khởi tạo các Máy bayChim các loại. Các bay_objects vectơ là một vectơ của các thể hiện đối tượng và vòng lặp đi qua vectơ và gọi bay phương pháp trên các trường hợp.

kết quả từ việc thực hiện kế thừa trong Rust

Triển khai tính đa hình trong Rust

Một lớp hoặc loại là đa hình nếu nhiều loại đại diện cho một giao diện. Vì các đặc điểm cung cấp chức năng xác định hành vi trong Rust, đồng thời cung cấp giao diện chung để viết mã chung, nên bạn có thể sử dụng Đặc điểm để triển khai tính đa hình.

Đây là một đặc điểm có tên có thể vẽ được xác định hành vi để hiển thị các đối tượng trên màn hình:

 trait Drawable {
    fn draw(&self);
}

Các loại triển khai đặc điểm Drawable có thể truy cập vào vẽ tranh chức năng.

 struct Rectangle {
    width: u32,
    height: u32,
}
impl Drawable for Rectangle {
    fn draw(&self) {
        
    }
}


Bạn có thể viết mã chung để vẽ các đối tượng thực hiện có thể vẽ được đặc điểm.

 fn draw_object<T: Drawable>(object: &T) {
    object.draw();
}

Các draw_object chức năng có một loại chung T làm đầu vào thực hiện có thể vẽ được đặc điểm và gọi các vẽ tranh phương pháp trên tính trạng. Các đối tượng khác nhau có thể thực hiện các có thể vẽ được đặc điểm và truy cập các chức năng.

Thực hiện trừu tượng hóa trong Rust

Trừu tượng hóa là khái niệm OOP trong đó các lớp và giao diện có thể truy cập được đối với các đối tượng và loại được chỉ định. Bạn có thể triển khai tính trừu tượng trong Rust với các đặc điểm.

Đây là một đặc điểm ví dụ cho trình phát đa phương tiện:

 trait Media {
    fn play(&self);
}

Structs và enums thực hiện Phương tiện truyền thông đặc điểm phải cung cấp một thực hiện cho chơi phương pháp.

 struct Song {
    title: String,
    artist: String,
}
impl Media for Song {
    fn play(&self) {
        println!("Playing song: {} by {}", self.title, self.artist);
    }
}


Các Bài hát cấu trúc thực hiện Phương tiện truyền thông đặc điểm bằng cách cung cấp một thực hiện cho chơi phương pháp in một tin nhắn với các trường của Bài hát cấu trúc cho bàn điều khiển.

 fn main() {
    
    let song = Song {
        title: String::from("Bohemian Rhapsody"),
        artist: String::from("Queen"),
    };
    
    song.play();
}


Các bài hát biến là một thể hiện của Bài hát struct và biến có thể truy cập và gọi chơi phương pháp.

kết quả từ việc thực hiện trừu tượng hóa trong Rust

Tổ chức Rust Code thật dễ dàng

Lập trình hướng đối tượng giúp tổ chức mã. Nhờ hệ thống mô-đun của Rust, bạn có thể dễ dàng tổ chức mã Rust của mình trong khi triển khai các khái niệm OOP cho ứng dụng của mình để giữ cho mã của bạn được tổ chức, dễ quản lý và trực quan.

Previous Post
Next Post

post written by: