参照外し演算子は暗黙に呼び出されるので、それをオーバーロードしてしまえば継承(もどき)ができる。
例
struct Hoge{}
impl Hoge{
fn say_hoge(&self){println!("hoge")}
}
struct Moge{
hoge:Hoge
}
//裏技
use std::ops::Deref;
impl Deref for Moge{
type Target = Hoge;
fn deref(&self) -> &Self::Target {&self.hoge}
}
impl Moge{
fn new() -> Self {Moge{hoge:Hoge{}}}
fn say_moge(&self){println!("moge")}
fn say_hoge_moge(&self){
self.say_moge();
self.hoge.say_hoge(); //内部からアクセスする時は普通に呼び出さないといけない
}
}
fn main(){
let moge = Moge::new();
moge.say_hoge(); //内包するメンバのメソッドを直接呼び出せる
moge.say_moge(); //追加されたメソッドも普通に呼び出せる
}
感想
スマートポインタが勝手に解決されるのを見てて気が付いた。
特定のメンバとそれ自身を同一であるかのように振舞わせたい時、ラッパーメソッドを沢山作らなくても良い。
ただ、これだとポリモーフィズムが実現されてないので普通にトレイトを作った方が良い。トレイト作った上で、トレイトは弄りたくないけど外部からは内部の構造体に簡単にアクセスできるようにしたいとかそういう時しか実用性無さそう。