[英]Use trait blanket implementation to restrict type trait bounds in 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) {}
}
這很好用,但有點煩人,因為您需要為每個實現同時實現Rule
和CreatureRule
。 我試圖對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#1210和rust-lang/rust#31844 ),目前需要每晚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.