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>,
}

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,
}

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>,此处便是一个一个trait object,我们可以在这个向量中放入任何实现了Draw这个trait的类型的实例,因而实现了面向对象的多态。

你可能感兴趣的:(rust,rust)