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

视频地址

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

源码地址

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

讲解内容

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();
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值