我正面临协议方法调度的问题.
我有一个类层次结构,看起来像这样:
protocol E {
func test()
}
extension E {
func test() {
print("jello")
}
}
class A: E {
}
class B: A {
func test() {
print("hello")
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我打电话给静态强制输入test类的实例时,"jello"被打印出来,而不是"你好".BA
let b: A = B() // prints "jello" not "hello"
b.test()
Run Code Online (Sandbox Code Playgroud)
我的理解是test方法打印"jello"被"集成"到A(因为A符合E协议)的实例中.然后我提供另一个test内部实现B(继承表单A).我以为多态性会在这里工作,并呼吁test在B实例存储内A引用将打印hello.这里发生了什么事?
不使用任何协议时,它完美地工作:
class A {
func test() {
print("jello")
} …Run Code Online (Sandbox Code Playgroud)