rust面向对象之继承

rust实现继承和类c语言差异较大,基本上和go的继承类似,一脉相承的理念,接下来我们看例子:

// 定义父结构体Animal
#[derive(Debug)]
 struct Animal {
     age: u16,
 }
 impl Animal {
     fn new(age: u16) -> Self {
         Self { age }
     }
 }
 impl Animal {
     pub fn print_age(&self) {
         println!("Animal {}", self.age);
     }

     fn set_age(&mut self, age: u16) {
         self.age = age;
     }
 }

// 定义子类
#[derive(Debug)]
struct Dog  {
     animal: Animal,
     name: String,
 }
impl Dog  {
     fn new(animal: Animal, name: &str) -> Self {
        Self { animal , name: name.to_string()}
     }
 }
 impl Dog {
     fn as_animal(&self) -> &Animal {
         &self.animal
     }

     fn as_mut_animal(&mut self) -> &mut Animal {
         &mut self.animal
     }
 }
 
 // 调用
 fn main() {
    let student = Animal::new(18);
    let mut tome = Dog ::new(student, "旺财");

    tome.animal.print_age();
    tome.animal.set_age(16);
    tome.animal.print_age();

    println!("{:#?}", tome);

    let a: &Animal = tome.as_animal();
    a.print_age();
    let a: &mut Animal = tome.as_mut_animal();
    a.set_age(6);
    a.print_age();
}

总结:从上面一个例子可以看到,rust其实并没有传统意义上的继承,这点和go是一致的,go的所谓继承其实是隐式实现了和rust这种,go只是省略了变量名称内部用结构体名称做为隐式的变量名,推测可能是rust团队不赞同继承方案,而是觉得组合优于继承,综上其实换一种思维方式也算实现了继承。

你可能感兴趣的:(rust)