有条件的默认实现

问题描述 投票:0回答:1

是否可以为特征

fun_b
的函数/方法
TraitB
定义默认实现,以防特征
TraitA
也被实现? 下面我定义了一个额外的特征
TraitBDerived
和超级特征
TraitA
但我希望这个潜在的默认实现是透明的,因为不需要使用另一个特征。

trait TraitA {
    fn fun_a() -> String;
}

trait TraitB {
    fn fun_b() -> String;
}

trait TraitBDerived: crate::TraitA {
    fn fun_b() -> String {
        String::from("prefix ").add(&Self::fun_a())
    }
}
rust
1个回答
0
投票

就像标准库中一样 - 为所有实现

TraitB
的类型实现
TraitA
,例如参见游乐场

但请注意,您无法为所有类型实现外部特征,只能实现您定义的特征。

use std::ops::Add;

trait TraitA {
    fn fun_a() -> String;
}

trait TraitB {
    fn fun_b() -> String;
}

impl<T> TraitB for T where T: TraitA {
    fn fun_b() -> String {
        String::from("prefix ").add(&Self::fun_a())
    }
}

impl TraitA for i32 {
    fn fun_a() -> String { "TraitA".to_owned() }
}

impl TraitB for usize {
    fn fun_b() -> String { "TraitB".to_owned() }
}


fn main(){
    println!("{}", i32::fun_a()); // TraitA
    println!("{}", i32::fun_b()); // prefix TraitA
    //println!("{}", usize::fun_a()); // not implemented
    println!("{}", usize::fun_b()); // TraitB
}
© www.soinside.com 2019 - 2024. All rights reserved.