MST

星途 面试题库

面试题:Rust中复杂继承体系下trait完全限定语法的运用

假设有一个`trait` `Animal`,包含`movement`方法。`Mammal`和`Bird`都继承自`Animal`并分别对`movement`方法有不同实现。`Dog`继承自`Mammal`,`Eagle`继承自`Bird`。现在有一个函数`describe_movement`,它接收一个`&dyn Animal`类型的参数。在这个函数中,当参数实际类型为`Dog`时,要使用`trait`完全限定语法调用`Mammal`实现的`movement`方法;当参数实际类型为`Eagle`时,要使用`trait`完全限定语法调用`Bird`实现的`movement`方法。请写出完整代码,包括所有必要的`trait`和结构体定义,并处理好类型转换和动态分发相关问题。
23.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
trait Animal {
    fn movement(&self);
}

struct Mammal;
struct Bird;
struct Dog;
struct Eagle;

impl Animal for Mammal {
    fn movement(&self) {
        println!("Mammal moves in a general way.");
    }
}

impl Animal for Bird {
    fn movement(&self) {
        println!("Bird flies.");
    }
}

impl Animal for Dog {
    fn movement(&self) {
        println!("Dog runs.");
    }
}

impl Animal for Eagle {
    fn movement(&self) {
        println!("Eagle soars.");
    }
}

fn describe_movement(animal: &dyn Animal) {
    if let Some(dog) = animal.downcast_ref::<Dog>() {
        <Mammal as Animal>::movement(&Mammal);
    } else if let Some(eagle) = animal.downcast_ref::<Eagle>() {
        <Bird as Animal>::movement(&Bird);
    }
}

fn main() {
    let dog = Dog;
    let eagle = Eagle;

    describe_movement(&dog);
    describe_movement(&eagle);
}