Jump to Navigation

rust实现继承

rust实现继承

目前找到两种方式 ,一种使用AsRef trait,一种使用Deref trait,都能实现单继承,而AsRef则能实现类似多继承的功能。

第一种,显式的.as_ref()

AsRef这是rust提供的一个trait,用来做类型的转换,例如,

impl AsRef for NButton { fn as_ref(&self) -> &NWidget { return &self.nbase; } }

其含义为,为NButton类型实现AsRef trait,可以把NButton类型引用转换为NWidget引用。

前提是NButton引用能在某处存放着一个nbase,如self.nbase。

有了这个trait实现之后,可以简单的方式实现类型转换了,

 btn.as_ref().callsth();

这个在使用上稍微有点不方便,需要显式地调用as_ref()方法。

多继承:

impl AsRef for NButton { fn as_ref(&self) -> &NAbstractButton { return &self.nbase; } }

也需要存放多个基类的实例了。有点复杂,还没有考虑清楚实现与使用。

第二种,Deref方式

Deref也是rust提供的trait,用于实现类型的转换。

use std::ops::Deref;

impl Deref for NButton {
    type Target = NWidget;

    fn deref(&self) -> & NWidget {
          return &self.nbase;
     }        
}

因为Deref trait没有模板参数,所以只能为NButton实现一个deref方法,也就只能模拟单继承了。

不过Deref的好处是,在使用的时候是隐式转换的,不需要btn.deref()调用,而是可以直接调用父类的方法。

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut