用组合模拟场遗传

时间:2017-12-12 01:28:06

标签: inheritance struct enums rust composition

我有几对结构,其中一个是另一个的完美超集。我想模拟某种继承,所以我不必为每个结构都有单独的情况,因为这几乎会使我的代码翻倍。

在像C这样的语言中,我可以用这样的东西来模拟字段的继承:

struct A
{
    int a;
};

struct B
{
    struct A parent;
    int b;
};

main()
{
    struct B test1;
    struct A *test2 = &test1;
    test2->a = 7;
}

我想在Rust中做这样的事情。我读过类似here之类的东西,但是当我尝试它时,似乎还没有实现。有没有办法在没有单独的案例处理的情况下重用另一个结构中的字段?

这是我尝试的枚举语法:

enum Top
{
    a: i32,
    A {},
    B {
        b: i32
    }
}

这是我的错误:

error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
 --> src/main.rs:3:6
  |
3 |     a: i32,
  |      ^ expected one of `(`, `,`, `=`, `{`, or `}` here

Link进行一些示例执行。

1 个答案:

答案 0 :(得分:2)

针对枚举中常见字段的建议语法尚未实现Rust 1.22。现在唯一的选择是普通的旧构图。如果您希望能够在包含A的多种类型上进行一般操作,您可以定义一个特性,提供对A的访问权限并在所有这些类型上实现它:

trait HaveA {
    fn a(&self) -> &A;
    fn a_mut(&mut self) -> &mut A;
}

impl HaveA for B {
    fn a(&self) -> &A {
        &self.parent
    }

    fn a_mut(&mut self) -> &mut A {
        &mut self.parent
    }
}