1 Rust与面向对象编程

  • 封装数据与行为、隐藏细节:结构体与枚举
  • 继承以共享代码:不支持
  • 多态:通过特性实现

    2 通过Box来使用特性

  1. #![allow(dead_code)]
  2. trait Draw{
  3. fn draw(&self);
  4. }
  5. struct Screen {
  6. components: Vec<Box<Draw>>
  7. }
  8. impl Screen{
  9. fn run(&self){
  10. for item in self.components.iter(){
  11. item.draw();
  12. }
  13. }
  14. }
  15. struct Button {
  16. width: u32,
  17. height: u32,
  18. label: String,
  19. }
  20. impl Draw for Button {
  21. fn draw(&self) {}
  22. }
  23. struct SelectBox {
  24. width: u32,
  25. height: u32,
  26. options: Vec<String>,
  27. }
  28. impl Draw for SelectBox {
  29. fn draw(&self) {}
  30. }
  31. pub fn main() {
  32. let screen = Screen {
  33. components: vec![
  34. Box::new(SelectBox {
  35. width: 75,
  36. height: 10,
  37. options: vec![
  38. String::from("Yes"),
  39. String::from("Maybe"),
  40. String::from("No")
  41. ],
  42. }),
  43. Box::new(Button {
  44. width: 50,
  45. height: 10,
  46. label: String::from("OK"),
  47. }),
  48. ],
  49. };
  50. screen.run();
  51. }

3 特性对象

只有对象安全(object safe)的特性才可以用作特性对象。关于对象安全有一些复杂的规则,但通常仅考虑以下两点:特性的所有方法需要满足下述两个条件:

  • 返回值类型不是Self
  • 不带泛型参数