AsRef模拟Atl里的继承关系

用AsRef模拟atl的继承方法
代码有点长,这个是模拟atl里某个类可以从TBase继承或者从TBase的子类继承(一般TBase就是CWindow)
AsRef是一个目前相对比较方便的引用类型转换的方法

#[derive(Debug)]
struct CWin{
    d: i32,
}

impl New for CWin{
    fn new()->CWin {
        CWin{
            d:400,
        }
    }
}

#[derive(Debug)]
struct Foo{
    cwin: CWin,
    d:i32,
}

impl AsRef<CWin> for CWin{
    fn as_ref(&self)->&CWin{
        self
    }
}

impl New for Foo{
    fn new()->Foo {
        Foo{
            d:100,
            cwin: CWin{d:200},
        }
    }
}

impl AsRef<CWin> for Foo{
    fn as_ref(&self)->&CWin{
        &self.cwin
    }
}

fn foo<T: AsRef<CWin>>(t: &T){
    let c = t.as_ref();
    println!("{}",c.d);
}

#[derive(Debug)]
struct Bar<T: AsRef<CWin>>{
    t: T,
    d: i32,
}

trait New {
    fn new()->Self;
}

impl<T: AsRef<CWin> + New> Bar<T> {
    fn print(&self){
        let c = self.t.as_ref();
        println!("{}",c.d);
    }

    fn new()->Bar<T>{
        Bar{
            t: T::new(),
            d:300,
        }
    }
}

type FooBar = Bar<Foo>;
type WinBar = Bar<CWin>;

fn main(){
    // 直接使用as_ref
    let f = Foo::new();
    foo(&f);

    let fb = FooBar::new();
    fb.print();

    println!("{:?}",fb);

    let wb = WinBar::new();
    wb.print();
    println!("{:?}",wb);
}

https://play.rust-lang.org/?gist=5c82dbbb0316fa7f73d8&version=stable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值