【发布时间】:2017-04-11 19:14:40
【问题描述】:
假设有以下协议,其中包含由扩展提供的 someFuncWithDefaultImplementation() 的默认实现。
那么 MyClass2 是否可以同时提供自己的 someFuncWithDefaultImplementation() 实现,该实现还从扩展中调用该方法的默认实现?
protocol MyProtocol : class {
func someFuncWithDefaultImplementation()
func someFunc()
var someInt:Int { get set }
}
extension MyProtocol {
func someFuncWithDefaultImplementation() {
someInt = 5
}
func someFunc() {
someFuncWithDefaultImplementation()
}
}
class MyClass : MyProtocol {
var someInt = 6
}
class MyClass2 : MyProtocol
{
var someInt: Int = 4
func someFuncWithDefaultImplementation()
{
// do some additional stuff
/*** someFuncWithDefaultImplementation() invoke MyProtocol extension implementation here ***/
}
}
let class1 = MyClass()
class1.someFunc()
let class2 = MyClass2()
class2.someFunc()
【问题讨论】:
-
@MrSaturn - 在您的副本中尝试了该解决方案,但在这种情况下似乎不起作用。
-
@TusharSharma 不理解您的评论。哪里有覆盖代码中现有功能的扩展?有一个扩展提供了默认实现,它在哪里覆盖了功能?
-
确保查看链接的欺骗线程中的the (non-elegant) answer using a nested dummy type(例如,
someFuncWithDefaultImplementation()的正文中的class Dummy : MyProtocol { var someInt: Int = 0 }和Dummy().someFuncWithDefaultImplementation()MyClass2以上)。 -
OP:再次查看由 MrSaturn 链接到的线程,特别是关于嵌套虚拟类型的线程。另外,不要在意每个人都在谈论覆盖,因为他们将协议默认实现与为符合子类化而提供。