1
0

More than 1 year has passed since last update.

Rustでトレイトを使わずに継承する裏技

Last updated at Posted at 2022-04-26

参照外し演算子は暗黙に呼び出されるので、それをオーバーロードしてしまえば継承(もどき)ができる。

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(); //追加されたメソッドも普通に呼び出せる
}

感想

スマートポインタが勝手に解決されるのを見てて気が付いた。
特定のメンバとそれ自身を同一であるかのように振舞わせたい時、ラッパーメソッドを沢山作らなくても良い。
ただ、これだとポリモーフィズムが実現されてないので普通にトレイトを作った方が良い。トレイト作った上で、トレイトは弄りたくないけど外部からは内部の構造体に簡単にアクセスできるようにしたいとかそういう時しか実用性無さそう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0