2

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

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的实施”

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

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

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

它开始打印出来

B的实现

为什么会这样?

4

1 回答 1

1

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

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

您可以在此处阅读有关此内容的更多信息。

于 2016-11-22T12:01:53.137 回答