RUST——多态的实现

由于rust并不支持继承的机制,在rust中实现多态,需要使用到rust中的trait机制,trait机制可以类比java语言中的接口。然后利用struct来实现trait中定义的方法,那么相应的实现类型的实例就是trait object。然后trait的实例对象就是trait object,进而实现多态。

下面的示例代码中实现了一个简单的GUI库,定义了一个Screen的结构,其中的run方法会依次调用其所包含的组件中的每一个组件的draw方法来进行图形的绘制,每一个图形的类型都会实现一个我们事先定义的trait的draw方法,这里的trait方法就是对所有组件的一个通用行为的一个抽象。

示例代码如下:

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

pub struct Screen {
    pub components: Vec<Box<dyn Draw>>,
}

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!("Button: width: {}, heigth: {}, label: {}", self.width, self.height, self.label);
    }
}

在gui库的内部我们内置了Button这个组件,同时对外公布了trait中定义的方法,可以让用户基于此来做扩展,下面看一下使用示例代码:

use gui::{Draw, Screen, Button};

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

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

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")
            })
        ],
    };

    screen.run();
}

在使用代码中,对组件做了扩展,自定义了SelectBox组件。

我们可以看到Screen结构中的属性components的定义,Vec<Box<dyn Draw>>,此处便是一个一个trait object,我们可以在这个向量中放入任何实现了Draw这个trait的类型的实例,因而实现了面向对象的多态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值