Я портирую некоторый код с C ++ на Rust, и я не уверен, какой эквивалентный способ обработки общих членов базового класса в C ++ заключается в идиоматическом Rust.Пример того, что у меня есть в C ++:
class Base {
public:
Base(int n) : n_(n) {}
virtual int foo() = 0;
int n_;
};
class D1 : public Base {
public:
D1(int n) : Base(n) {}
virtual int foo() {/* return something to do with n_ */}
};
class D2 : public Base {
public:
D1(int n) : Base(n) {}
virtual int foo() {/* return some other thing to do with n_ */}
};
В C ++ я могу определить n_
один раз в конструкторе базового класса, и я могу использовать его из любого из производных классов.
Мои структуры Rust в настоящее время выглядят так:
struct D1 {
n_: i32,
}
struct D2 {
n_: i32,
}
trait Base {
fn foo(&self) -> i32;
}
impl D1 {
fn new(n: i32) -> Self {
D1 { n_: n }
}
}
impl D2 {
fn new(n: i32) -> Self {
D2 { n_: n }
}
}
impl Base for D1 {
fn foo(&self) -> i32 {
// Contrived example to show D1 and D2 have different uses of n_
self.n_
}
}
impl Base for D2 {
fn foo(&self) -> i32 {
// Contrived example to show D1 and D2 have different uses of n_
self.n_ * 2
}
}
Это похоже на большее дублирование кода, чем я привык.Есть ли способ, чтобы элемент данных n_
был объявлен только один раз для обеих структур?