Swift中的动态调度与协议

Swift中的动态调度与协议,swift,swift-protocols,dynamic-dispatch,Swift,Swift Protocols,Dynamic Dispatch,考虑以下代码(相当乏味): 令我惊讶的是,这张照片开始打印出来 “A的实施” 我希望它打印“B的实现”,因为这(单元格:header)作为PBs默认实现的一部分被覆盖。这令人惊讶地没有发生 更有趣的是,如果我这样做: class B: A,PB { override func doSomethingElse() { self.doThis(cell: Cell(), header: Header()) } } 它开始打印出来 B.执行情况 为什么会这样 协议扩展

考虑以下代码(相当乏味):

令我惊讶的是,这张照片开始打印出来

“A的实施”

我希望它打印“B的实现”,因为这(单元格:header)作为
PB
s默认实现的一部分被覆盖。这令人惊讶地没有发生

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

class B: A,PB {
    override func doSomethingElse() {
        self.doThis(cell: Cell(), header: Header())
    }
}
它开始打印出来

B.执行情况


为什么会这样

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

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


您可以阅读更多相关信息。

虽然我确信协议扩展没有完成多态性部分,但没有太多关于原因的信息,Sealos。如果我将协议类型约束为只确认类,它仍然表现出相同的行为。对于斯威夫特,我缺少一些基本的东西。该链接解释了将func声明为需求和非需求时调度属性的差异;在我的例子中没有显示任何行为。当您想在C上调用doSomethingElse时,它将调用父方法(因为它继承自A),唯一可用的信息是A符合PA,它将使用PA的实现。如果直接从C.C.doSomethingElse()->PA实现和C.doThis()->PBYes调用它,应该能够得到PB doThis,这就是重点。这里没有动态调度。好的撇开惊讶不谈,我想知道为什么这不会发生。有没有任何设计决策促使语言设计者提出这个问题?我知道这并不是因为协议能够符合所有类型。
class B: A,PB {
    override func doSomethingElse() {
        self.doThis(cell: Cell(), header: Header())
    }
}