AsRef模拟Atl里的继承关系

来源:互联网 发布:21天学通c语言app 编辑:程序博客网 时间:2024/06/04 19:47

用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

0 0