问题描述
为什么下面的代码在#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 (将#修改为@)