在 Rust 用 trait 實現 OOP 的單層多重繼承
有了這寫法,就可以輕鬆實現多種功能隨意組合了
純方法,沒有依賴結構
直接寫 trait 跟 impl Trait for Struct {}
有依賴結構
// 功能 A
mod func_a {
#[derive(Default)]
pub struct FuncAStruct {
v: u8
}
pub trait FuncATrait: AsRef<FuncAStruct> + AsMut<FuncAStruct> {
fn a_get(&self) -> u8 {
//取值的方法,`self.as_ref()` 可以拿到 &FuncAStruct
self.as_ref().v
}
fn a_set(&mut self, value: u8) {
//改值的方法,`self.as_mut()` 可以拿到 &mut FuncAStruct
self.as_mut().v += value;
}
}
}
// 功能 B
mod func_b {
#[derive(Default)]
pub struct FuncBStruct {}
pub trait FuncBTrait: AsRef<FuncBStruct> + AsMut<FuncBStruct> {}
}
mod s {
use super::func_a::{ FuncAStruct, FuncATrait };
use super::func_b::{ FuncBStruct, FuncBTrait };
#[derive(Default)]
pub struct S {
func_a: FuncAStruct,
func_b: FuncBStruct,
}
// 讓 S 有功能 A
impl AsRef<FuncAStruct> for S {
fn as_ref(&self) -> &FuncAStruct {
&self.func_a
}
}
impl AsMut<FuncAStruct> for S {
fn as_mut(&mut self) -> &mut FuncAStruct {
&mut self.func_a
}
}
impl FuncATrait for S {}
// 讓 S 有功能 B
impl AsRef<FuncBStruct> for S {
fn as_ref(&self) -> &FuncBStruct {
&self.func_b
}
}
impl AsMut<FuncBStruct> for S {
fn as_mut(&mut self) -> &mut FuncBStruct {
&mut self.func_b
}
}
impl FuncBTrait for S {}
}
use self::s::S;
// 把需要用到的功能引進來才能用
use self::func_a::FuncATrait;
fn main() {
let mut s: S = Default::default();
s.a_set(9);
println!("func_a.v = {}", s.a_get());
}
Leave a Comment