AsRef模拟Atl里的继承关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/varding/article/details/50233775

用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

猜你喜欢

转载自blog.csdn.net/varding/article/details/50233775