🫠

Rustの継承を試したけど、うまくいことできませんでした

2024/02/12に公開

あらすじ

手持ちのプログラムに機能追加しようとして、すでにある構造体(以下、Struct A)と同じような機能を持った別の構造体(以下、Struct B)を作ることになった。

同じような機能を持った構造体(もしくはクラス)を作成するとき、いったん抽象化したものを作成し、具体的な構造体・クラスとしてAとBを作成するのが一般的だろう。

Rustを使い始めて早1年、継承とか聞いたことあるし、Traitとかに手を出してみようかな...。

結論

できません。

Traitは、関数と定数のみ定義可能で、通常のフィールドを定義することは不可能です。

回避方法

手っ取り早いのは、getterの作成です。

// 抽象的なTrait、Abst
pub trait Abst {
    fn get_id(&self) -> Uuid; // 実装は書かない、フィールドが定義されていないから
}

// 具体的な構造体、A
pub struct A {
    pub id: Uuid
}
impl Abst for A {
    fn get_id(&self) -> Uuid {
        return self.id.clone() // Aに対してフィールドが定義されているので、OK
    }
}

しかしこの方法ではA、B共にidフィールドを持っているとき、同じコードを2度書く羽目になります。

どうしてもイヤだったら、proc-macroを使うとよいかもしれません(下記参照)。
https://zenn.dev/tak_iwamoto/articles/890771ea5b8ad3

その後

大した規模のプログラムでもないのと、初心者にも見せたいプログラムなので、わかりやすさを優先し、しばらくは手書きgetterで対処することにしました。

定数が定義できるなら、フィールドが定義できてもいいんじゃないの????

Discussion