rust-quiz:027-subtrait-dispatch.rs

godme發表於2022-07-15
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 協議》,轉載必須註明作者和本文連結

相關文章