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 協議》,轉載必須註明作者和本文連結