gpt4 book ai didi

swift - Swift 中的动态调度和协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 02:12:10 25 4
gpt4 key购买 nike

考虑这个(相当乏味的)代码:

class SCell : NSObject {}
class SHeader : NSObject {}

class Cell : SCell {}
class Header : SHeader {}
struct Model {}

protocol PA {
typealias Ce = SCell
typealias He = SHeader
func doThis(cell : PA.Ce,header : PA.He)
}

extension PA {
func doThis(cell : PA.Ce,header : PA.He) {
print("A's implementation")
}
}

protocol PB:PA {

}

extension PB {
func doThis(cell : PA.Ce,header : PA.He) {
print("B's implementation")
}
}

class A : PA {
func doSomethingElse() {
self.doThis(cell: Cell(), header: Header())
}
}

class B : A,PB {

}

class C : B {}

let c = C()
c.doSomethingElse()

令我惊讶的是,这开始打印出来了

"A's implementation"

我期待它打印“B 的实现”,因为 doThis(cell:header) 被覆盖为 PB 的默认实现的一部分。令人惊讶的是,这并没有发生。

更有趣的是,如果我这样做:

class B: A,PB {
override func doSomethingElse() {
self.doThis(cell: Cell(), header: Header())
}
}

开始打印了

B's implementation

为什么会这样?

最佳答案

协议(protocol)扩展不做多态性,所以在这种情况下,如果不需要它们,它们不会被动态调度。原因是类、结构和枚举可以采用协议(protocol)。

另一个原因是您在 PA 中为协议(protocol)提供了默认实现,因此 PB 仅在该方法缺失时才会生效(这不是因为它已经在 PA 中定义了。

您可以阅读更多相关信息 here .

关于swift - Swift 中的动态调度和协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40740756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com