用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