特征可以为继承自其的特征的方法提供默认实现吗?

时间:2018-09-20 06:20:32

标签: rust traits

我有两种方法的特质。实现该特征的一些(但不是全部)结构具有以下方法之一的所有相同实现:

trait Blabla {
    fn xy(self, x: u32, y: u32) -> u32;
}

// ---------------------------------
struct Ding {}

impl Blabla for Ding {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y
    }
}

// ---------------------------------
struct Dong {
    dong_attribute: u32,
}

impl Dong {
    fn get_1(self) -> u32 {
        1
    }
}

impl Blabla for Dong {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

// ---------------------------------
struct Dung {
    dung_attribute: f32,
}

impl Dung {
    fn get_1(self) -> u32 {
        1
    }
}

impl Blabla for Dung {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

该示例中有三个结构,每个结构都实现Blabla特性,其中两个结构以完全相同的方式实现xy方法。

有没有办法让他们共享该功能的代码?

我在想第二个特征,它继承自Blabla并提供xy作为该特征的默认实现,例如:

trait Blabla {
    fn xy(self, x: u32, y: u32) -> u32;
}

// ----------------------------------
trait Blubblub: Blabla {
    fn get_1(self) -> u32;
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

// ---------------------------------
struct Ding {}

impl Blabla for Ding {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y
    }
}

// ---------------------------------
struct Dong {
    dong_attribute: u32,
}

impl Blubblub for Dong {
    fn get_1(self) -> u32 {
        1
    }
}

// ---------------------------------
struct Dung {
    dung_attribute: f32,
}

impl Blubblub for Dung {
    fn get_1(self) -> u32 {
        1
    }
}

fn main() {
    let x = Dung {
        dung_attribute: 1.0,
    };
    println!{"{}", x.xy(1,1)};
}

这是行不通的,因为Rust中的特征继承意味着两个特征都需要实现,因此并不能避免我在Blabla::xy的实现中为Dong输入相同的代码和Dung

1 个答案:

答案 0 :(得分:4)

使用public sealed class CustomJsonSerializer : JsonSerializer { public CustomJsonSerializer() { DateFormatString = "yyyy-MM-dd"; // ... other formatting stuff ... } } 的默认实现实施JsonSerializer,您的示例可以正常工作

NancyBootStrapper