当前位置:   article > 正文

RUST——多态的实现_rust 多态

rust 多态

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

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

示例代码如下:

  1. pub trait Draw {
  2. fn draw(&self);
  3. }
  4. pub struct Screen {
  5. pub components: Vec<Box<dyn Draw>>,
  6. }
  7. impl Screen {
  8. pub fn run(&self) {
  9. for component in self.components.iter() {
  10. component.draw();
  11. }
  12. }
  13. }
  14. pub struct Button {
  15. pub width: u32,
  16. pub height: u32,
  17. pub label: String,
  18. }
  19. impl Draw for Button {
  20. fn draw(&self) {
  21. println!("Button: width: {}, heigth: {}, label: {}", self.width, self.height, self.label);
  22. }
  23. }

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

  1. use gui::{Draw, Screen, Button};
  2. struct SelectBox {
  3. width: u32,
  4. height: u32,
  5. options: Vec<String>,
  6. }
  7. impl Draw for SelectBox {
  8. fn draw(&self) {
  9. println!("SelectBox: width: {}, height: {}, options: {:?}", self.width, self.height, self.options);
  10. }
  11. }
  12. fn main() {
  13. let screen = Screen {
  14. components: vec![
  15. Box::new(SelectBox{
  16. width: 75,
  17. height: 10,
  18. options: vec![
  19. String::from("Yes"),
  20. String::from("Maybe"),
  21. String::from("No"),
  22. ]
  23. }),
  24. Box::new(Button {
  25. width: 50,
  26. height: 10,
  27. label: String::from("OK")
  28. })
  29. ],
  30. };
  31. screen.run();
  32. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/847166
推荐阅读
相关标签
  

闽ICP备14008679号