Как создать структуры, которые все реализуют черту, которая имеет общих членов данных? - PullRequest
1 голос
/ 28 сентября 2019

Я портирую некоторый код с 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_ был объявлен только один раз для обеих структур?

...