rust学习十八.1、RUST的OOP和简单示例

打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

很可惜,出于一些理由,rust抛弃了OOP的核心特性之一:继承
此中一个理由应该是至关告急的,但是解释的比力含糊:继承增加了复杂性
 
简直,继承会让rust编译器变得更加复杂。rust编译器虽然足够体贴,但是它偏慢的编译速度也是很多人所吐槽的。
在我对rust编译相识更多之前,我对这个理由无法给出更加具体的形貌,不过我可以大概明白。 说真话,编写这样的编译器已经足够复杂,如果还要
考虑到继承,大概这种复杂度会让编译器开辟者崩溃。
至于其它的理由,比方认为组合足够好用,我以为有些牵强了!
 
总之,rust对oop的支持主要体现在封装和多态。
 
而所谓的封装,在rust中主要体现在类似java对象的范例:struct,enum中,尤其是struct。
在rust中,struct的地位类似于java的Object。
 
所谓的多态,主要体现在特质(trait),这个时间的特质就类似于java,c++的接口(interface)
只不过,rust的这个特质是java的接口的阉割版本。
rust的特质作为接口存在的时间,只有以下两个功能:

  • 没有实现的方法定义
  • 具有默认实现的方法,类似java接口的默认函数.但是后者的默认函数,有静态,私有,默认私有等四种,这是因为前者没有继承的缘故
 
闲言少叙,总之rust对oop的支持大概就是这样了。
一、简单示例

animals.rs
  1. pub mod animals{
  2.    
  3.     pub trait Animal{
  4.         fn eat(&self,food:&String);
  5.         fn run(&self);
  6.         fn sleep(&mut self);
  7.         fn is_wakeup(&self)->bool;
  8.         fn wakeup(&mut self);
  9.      }
  10.     pub struct Dog{
  11.         name:String,
  12.         state:bool
  13.     }
  14.     impl Dog{
  15.         pub fn new(name:String)->Self{
  16.             Dog{name,state:true}
  17.         }
  18.     }
  19.     impl Animal for Dog{
  20.         fn eat(&self,food:&String){
  21.             if !self.is_wakeup(){
  22.                 println!("{} 正在睡觉...请不要打扰我,等醒了再吃",self.name);
  23.                 return;
  24.             }
  25.             if  food=="骨头"{
  26.                 println!("{} 正在吃{}",self.name,food);
  27.             }
  28.             else{
  29.                 println!("{} 不吃{}",self.name,food);
  30.             }
  31.         }
  32.         fn run(&self){
  33.             if !self.is_wakeup(){
  34.                 println!("{} 正在睡觉...请不要打扰我,等醒了再跑",self.name);
  35.                 return;
  36.             }
  37.             println!("{} is running",self.name);
  38.         }
  39.         fn sleep(&mut self){
  40.             println!("{} is sleeping",self.name);
  41.             self.state=false;
  42.         }
  43.         fn is_wakeup(&self)->bool{
  44.             self.state
  45.         }
  46.         fn wakeup(&mut self){
  47.             println!("{} 起来!",self.name);   
  48.             self.state=true;
  49.         }
  50.     }
  51.     pub struct Cat{
  52.         name:String,
  53.         state:bool
  54.     }
  55.     impl Cat{
  56.         pub fn new(name:String)->Self{
  57.             Cat{name,state:true}
  58.         }
  59.     }
  60.     impl Animal for Cat{
  61.         fn eat(&self,food:&String){
  62.             if !self.is_wakeup(){
  63.                 println!("{} 正在睡觉...",self.name);
  64.                 return;
  65.             }
  66.             if food=="鱼"{
  67.                 println!("{} 正在吃{}",self.name,food);
  68.             }else{
  69.                 println!("{} 不吃{}",self.name,food);
  70.             }
  71.         }
  72.         fn run(&self){
  73.             if !self.is_wakeup(){
  74.                 println!("{} 正在睡觉...请不要打扰我,等醒了再跑",self.name);
  75.                 return;
  76.             }
  77.             println!("{} is running",self.name);
  78.         }
  79.         fn sleep(&mut self){
  80.             println!("{} is sleeping",self.name);
  81.             self.state=false;
  82.         }
  83.         fn is_wakeup(&self)->bool{
  84.             self.state
  85.         }
  86.         fn wakeup(&mut self){
  87.             println!("{} 起来!",self.name);   
  88.             self.state=true;
  89.         }
  90.     }
  91. }
复制代码
 
main.rs
  1. mod animals;
  2. use animals::animals::{Animal, Dog, Cat};
  3. fn main(){
  4.    
  5.    let mut dog= Dog::new(String::from("小虎"));
  6.    let mut cat= Cat::new(String::from("小白"));
  7.    dog.run();
  8.    cat.run();
  9.    dog.sleep();
  10.    cat.sleep();
  11.    dog.run();
  12.    cat.run();
  13.    //
  14.    dog.wakeup();
  15.    cat.wakeup();
  16.    let fish=String::from("骨头");
  17.    dog.eat(&fish);
  18.    cat.eat(&fish);
  19.    let bone=String::from("鱼");
  20.    dog.eat(&bone);
  21.    cat.eat(&bone);
  22. }
复制代码
 
测试下:

 
如果用上继承,那么is_wakeup函数完全不需要写两遍。
 
二、小结

总之,rust对于oop的支持主要体现两点:

  • 封装-靠struct,enum
  • 多态-通用范例+特质
也许某天,rust会把特质设计的更体贴(复杂),但可能性不是太大,盖因rustc已经足够复杂了。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表