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::method
和Base::method
。
两者的实现并不相同,由于这里都是Base::method
,因此都打印1
答案
11
本作品采用《CC 协议》,转载必须注明作者和本文链接