gpt4 book ai didi

inheritance - 一个结构是否可以扩展现有结构,同时保留所有字段?

转载 作者:行者123 更新时间:2023-11-29 08:09:53 25 4
gpt4 key购买 nike

使用 rust 1.2.0

问题

我仍在学习 Rust(来自 Javascript 背景)并试图弄清楚一个结构 StructB 是否有可能扩展现有结构 StructA 使得 StructB 具有在 StructA 上定义的所有字段。

在 Javascript(ES6 语法)中,我基本上可以做这样的事情......

class Person {
constructor (gender, age) {
this.gender = gender;
this.age = age;
}
}
class Child extends Person {
constructor (name, gender, age) {
super(gender, age);
this.name = name;
}
}

约束

  • StructA 来 self 无法控制的外部 cargo 包。

目前的进展

我找到了这个 blog post on single-inheritance这听起来正是我需要的。

但尝试实现它会导致此错误消息 error: virtual structs have been removed from the language。后来搜索了一下,我发现它是implemented and then removed per RFC-341。相当快。

还发现了这个thread about using traits , 但由于 StructA 来自外部 cargo 包,我认为我不可能将其变成特征。

那么在 Rust 中实现这一点的正确方法是什么?

最佳答案

没有什么能与之完全匹配。我想到了两个概念。

  1. 结构组成

    struct Person {
    age: u8,
    }

    struct Child {
    person: Person,
    has_toy: bool,
    }

    impl Person {
    fn new(age: u8) -> Self {
    Person { age: age }
    }

    fn age(&self) -> u8 {
    self.age
    }
    }

    impl Child {
    fn new(age: u8, has_toy: bool) -> Self {
    Child { person: Person::new(age), has_toy: has_toy }
    }

    fn age(&self) -> u8 {
    self.person.age()
    }
    }

    fn main() {
    let p = Person::new(42);
    let c = Child::new(7, true);

    println!("I am {}", p.age());
    println!("My child is {}", c.age());
    }

    您可以简单地将一个结构嵌入到另一个结构中。内存布局很好而且紧凑,但是您必须手动将所有方法从 Person 委托(delegate)给 Child 或借出一个 &Person

  2. 特质

    trait SayHi {
    fn say_hi(&self);
    }

    struct Person {
    age: u8,
    }

    struct Child {
    age: u8,
    has_toy: bool,
    }

    impl SayHi for Person {
    fn say_hi(&self) {
    println!("Greetings. I am {}", self.age)
    }
    }

    impl SayHi for Child {
    fn say_hi(&self) {
    if self.has_toy {
    println!("I'm only {}, but I have a toy!", self.age)
    } else {
    println!("I'm only {}, and I don't even have a toy!", self.age)
    }
    }
    }

    fn greet<T>(thing: T)
    where T: SayHi
    {
    thing.say_hi()
    }

    fn main() {
    let p = Person { age: 42 };
    let c = Child { age: 7, has_toy: true };

    greet(p);
    greet(c);
    }

当然,您可以将这两个概念结合起来。


作为DK. mentions ,您可以选择实现 DerefDerefMut。但是,我不同意以这种方式使用这些特征。我的论点类似于这样的论点,即仅仅为了代码重用而使用经典的面向对象的继承是错误的。 “优先于继承的组合”=>“优先于 Deref 的组合”。但是,我确实希望有一种语言功能可以实现简洁的委托(delegate),从而减少组合的烦恼。

关于inheritance - 一个结构是否可以扩展现有结构,同时保留所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41423340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com