Upcasting coercion
还不稳定。所以这可以在
+nightly
use std::sync::{Arc, RwLock};
trait Child: Base {
fn method_a(&self);
}
trait Base {
fn method_b(&self);
}
struct MyStruct {
something: i32,
}
impl Child for MyStruct {
fn method_a(&self) {
println!("Method A");
}
}
impl Base for MyStruct {
fn method_b(&self) {
println!("Method B");
}
}
fn do_some_processing(parent: &Arc<RwLock<dyn Child>>) -> Arc<RwLock<dyn Base>> {
parent.clone()
}
fn main() {
let my_struct: Arc<RwLock<dyn Child>> = Arc::new(RwLock::new(MyStruct { something: 42 }));
let base = do_some_processing(&my_struct);
}
---或---
如果你想坚持稳定,你需要一些包装材料
use std::sync::{Arc, RwLock};
trait Child: Base {
fn method_a(&self);
}
trait Base {
fn method_b(&self);
}
struct MyStruct {
something: i32,
}
impl Child for MyStruct {
fn method_a(&self) {
println!("Method A");
}
}
impl Base for MyStruct {
fn method_b(&self) {
println!("Method B");
}
}
struct BaseWrapper {
inner: Arc<RwLock<dyn Child>>,
}
impl Base for BaseWrapper {
fn method_b(&self) {
self.inner.read().unwrap().method_b();
}
}
fn upcast(child: Arc<RwLock<dyn Child>>) -> Arc<RwLock<dyn Base>> {
Arc::new(RwLock::new(BaseWrapper { inner: child }))
}
fn main() {
let my_struct: Arc<RwLock<dyn Child>> = Arc::new(RwLock::new(MyStruct { something: 42 }));
let base = upcast(my_struct);
base.read().unwrap().method_b();
}