簡體   English   中英

覆蓋 Rust 中的一攬子特征實現

[英]Overriding a blanket trait implementation in Rust

對於我的游戲規則引擎,我有一個名為Rule的核心特征來處理游戲回調。 Rule有兩種類型: BaseRule適用於游戲中的任何實體, CreatureRule僅適用於 Creature。 我目前的代碼結構如下:

trait BaseRule<T> {
    fn on_turn_start(&self, owner: &T) {}
}

#[typetag::serde(tag = "type")]
pub trait CreatureRule: BaseRule<Creature> {
    fn on_death(&self, owner: &Creature) {}
}

這很好用,但有點煩人,因為您需要為每個實現同時實現RuleCreatureRule 我試圖對BaseRule進行全面實施:

impl<R: CreatureRule> BaseRule<Creature> for R {
}

但是如果我嘗試添加BaseRule特征的新實現,例如通過

impl BaseRule<Creature> for BaseMeleeDamageAttack {
    fn on_turn_start(&self, owner: &Creature) {
        // do stuff
    }
}

因為不能有相同特征的兩個實現。 有沒有辦法可以為實現CreatureRule但仍允許它們覆蓋函數的默認實現的類型提供BaseRule的全面默認實現?

(如果可能的話,我寧願避免在CreatureRule上使用泛型類型參數,因為 Serde 序列化不適用於具有泛型類型的特征。)

我認為您必須為每個手動實現它,但它只有一行:

impl BaseRule<Creature> for ... {}

自動實現將需要一個宏(這會使代碼的可讀性降低),或 impl 專業化( rust-lang/rfcs#1210rust-lang/rust#31844 ),目前需要每晚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM