调度到Swift协议扩展

问题描述

为什么下面的代码在#2处打印“ BaseP”?

protocol BaseP { func foo() }
extension BaseP { func foo() { print("BaseP") } }
protocol SubP: BaseP {}
extension SubP { func foo() { print("SubP") } }

class C: SubP {}
let subP1: SubP = C()
subP1.foo()   //  #1 prints "SubP",fine.

class BaseC: BaseP {}
class SubC: BaseC,SubP {}
let subP2: SubP = SubC()
subP2.foo()   //  #2 prints "BaseP". why?

    

在两种情况下,我们在静态类型为foo()的引用上调用SubP, 引用具有符合SubP的类的动态类型的对象。 即使是静态调度,我也认为它仍应调用SubP.foo()。 为什么在#2调用基本协议实现?

此外,为什么从BaseC继承会有所作为 (如果我在class SubC行中删除了BaseC或将其替换为BaseP, 然后突然打印出“ SubP”)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)