🫠
Rustの継承を試したけど、うまくいことできませんでした
あらすじ
手持ちのプログラムに機能追加しようとして、すでにある構造体(以下、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を使うとよいかもしれません(下記参照)。
その後
大した規模のプログラムでもないのと、初心者にも見せたいプログラムなので、わかりやすさを優先し、しばらくは手書きgetterで対処することにしました。
定数が定義できるなら、フィールドが定義できてもいいんじゃないの????
Discussion