我遇到了有关协议方法调度的问题。
我有一个类层次结构,如下所示:
protocol E {
func test()
}
extension E {
func test() {
print("jello")
}
}
class A: E {
}
class B: A {
func test() {
print("hello")
}
}
但是当我在类test
的实例上调用B
时,静态强制键入A
,“jello”会被打印,而不是“你好”。
let b: A = B() // prints "jello" not "hello"
b.test()
我的理解是test
方法打印“jello”被“集成”到A
的实例中(因为A
符合E
协议)。然后,我在test
内部提供B
的另一个实现(继承形式A
)。我认为多态可以在这里工作,在test
实例上调用存储在B
引用中的A
将打印hello
。这里发生了什么?
不使用任何协议时,它完全有效:
class A {
func test() {
print("jello")
}
}
class B: A {
override func test() {
print("hello")
}
}
let b: A = B() // prints "hello"
b.test()
与采用向父类添加新方法并在子类中提供新实现的协议有什么不同,而不是直接在父类中编写此方法然后在子类中重写它?
你们有解决方法吗?
答案 0 :(得分:3)
闻起来像个臭虫。
我提出的唯一解决办法非常难看......
protocol E {
func test()
}
func E_test(_s: E) {
print("jello")
}
extension E {
func test() { E_test(self) }
}
class A: E {
func test() { E_test(self) }
}
class B: A {
override func test() {
print("hello")
}
}
let b: A = B()
b.test()
答案 1 :(得分:1)
确实是一个错误。以下是指向它的链接:https://bugs.swift.org/browse/SR-103