Rust 编程视频教程(进阶)——021_1 trait 对象的例子

视频地址

头条地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

源码地址

github地址:https://github.com/anonymousGiga/learn_rus...

讲解内容

trait对象的例子:
(1) mkdir learn_oo2
(2)cd learn_oo2,编辑Cargo.toml

[workspace]
members = [
        "gui",
        "main",
]

(3) cargo new gui –lib
(4) 编辑gui/src/lib.rs源码

pub trait Draw {
    fn draw(&self);
}

pub struct Screen {
    pub components: Vec<Box<dyn Draw>>,  //trait对象,使用dyn关键字
}

impl Screen {
    pub fn run(&self) {
        for component in self.components.iter() {
            component.draw();
        }
    }
}

pub struct Button {
    pub width: u32,
    pub height: u32,
    pub label: String,
}

impl Draw for Button {
    fn draw(&self) {
        println!("draw button, width = {}, height = {}, label = {}",
                 self.width, self.height, self.label);
    }
}

pub struct SelectBox {
    pub width: u32,
    pub height: u32,
    pub options: Vec<String>,
}

impl Draw for SelectBox {
    fn draw(&self) {
        println!("draw selectBox, width = {}, height = {}, options = {:?}",
                 self.width, self.height, self.options);
    }
}

////复习
//pub struct Screen<T: Draw> {
//    pub components: Vec<T>,
//}
//
//impl<T> Screen<T>
//    where T: Draw {
//    pub fn run(&self) {
//        for component in self.components.iter() {
//            component.draw();
//        }
//    }
//}

(5) cargo new main
(6) 编辑Cargo.toml文件,添加:

[dependencies]
gui = {path = "../gui"}

(7) 编辑src/main.rs源码

use gui::{Screen, Button, SelectBox};
fn main() {
    let screen = Screen {
        components: vec![
            Box::new(SelectBox {
                width: 75,
                height: 10,
                options: vec![
                    String::from("Yes"),
                    String::from("Maybe"),
                    String::from("No")
                ],
            }),
            Box::new(Button {
                width: 50,
                height: 10,
                label: String::from("OK"),
            }),
        ],
    };

    //let screen = Screen {
    //    components: vec![
    //        SelectBox {
    //            width: 75,
    //            height: 10,
    //            options: vec![
    //                String::from("Yes"),
    //                String::from("Maybe"),
    //                String::from("No")
    //            ],
    //        },
    //        //Button {
    //        //    width: 50,
    //        //    height: 10,
    //        //    label: String::from("OK"),
    //        //},
    //    ]
    //};
    screen.run();
}
本作品采用《CC 协议》,转载必须注明作者和本文链接

令狐一冲

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!