rust-quiz:027-subtrait-dispatch.rs

题目

trait Base {
    fn method(&self) {
        print!("1");
    }
}

trait Derived: Base {
    fn method(&self) {
        print!("2");
    }
}

struct BothTraits;
impl Base for BothTraits {}
impl Derived for BothTraits {}

fn dynamic_dispatch(x: &dyn Base) {
    x.method();
}

fn static_dispatch<T: Base>(x: T) {
    x.method();
}

fn main() {
    dynamic_dispatch(&BothTraits);
    static_dispatch(BothTraits);
}

关键

  • 方法查找
    之前说的方法查找:T -> &T
    除了&T -> &mut T的坑之外,还有一点需要注意。
    那就是多态的方法查找,当然,T::f当然优先于Trait::f
    但是从不同的角度Trait去看,对应的f也会有不同的实现。
    对于这些方法的调用,我们需要尽量的使用Trait::f限定去进行调用。
    这样才能更明确的指定namespace,使得调用无歧义。

  • T
    方法标记泛型,内部的调用其实也隐含限定的意味。

题解

根据上述性质,题目中两个方法都限定了Base::method
虽然Derived:Base并且覆盖了method
但是从另一个角度理解,也就是Derived::methodBase::method
两者的实现并不相同,由于这里都是Base::method,因此都打印1

答案

11

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!