У меня есть черта с несколькими методами.Некоторые, но не все структуры, которые реализуют эту черту, имеют одинаковую реализацию одного из методов:
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
.