赞
踩
由于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的类型的实例,因而实现了面向对象的多态。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。