虽然这个问题看起来很简单,但解释了面向协议编程的所有方面以及 out 的重要性,这将使我围绕它写整个博客:)
无论如何,面向协议编程基本上使您能够利用面向对象编程语言(如 JAVA、Objective-C)不支持的多重继承,因为钻石问题 https://en.wikipedia.org/wiki/Multiple_inheritance
现在,虽然面向协议的编程允许您对功能进行建模
/功能作为协议而不是作为类的实例方法(如 Objective C 的情况),我们必须同意我们总是喜欢继承!!,记住您曾经使用某些操作来声明一个方法,然后扩展它,编写任何特定的内容到子级,并且仍然通过调用 super.methodname 来使用父级方法中的所有代码???现在你怎么可能在协议中实现它???代码不能重复使用吗??
所以协议默认实现是向类提供默认实现的简单方法,它只是想扩展和确认协议,但不费心去修改它。
示例:假设我有一个打印我的姓氏的协议,如果父类确认它,如果我也确认相同的协议,它将打印与我相同的姓氏:)正确,毕竟它是一个姓氏,它不会改变! !!
如果协议已经有自己的默认实现,那么仅仅因为您确认了协议,您就不需要提供其方法实现。如果您想做除提供的默认实现之外的其他操作,您将提供自己的实现:)
protocol Test {
func test1()
}
extension Test {
func test1() {
print("Yo man")
}
}
protocol Test2 {
func test2()
}
extension Test2 {
func test2() {
print("Bye man")
}
}
class ViewController: UIViewController,Test,Test2 {
override func viewDidLoad() {
super.viewDidLoad()
self.test1()
self.test2()
}
}
正如你所看到的,我没有为 test1 或 test2 提供任何实现,但我使用它就好像它已经为我实现了:)
这就是协议默认实现的目的。希望能帮助到你
观察:
你有两个协议,Test1 和 Test2 都有相同的方法显示,现在你进入了 DiamondProblem 的根本问题,如果我简单地调用 display() 调用哪个实现?测试1还是测试2?? Swift 在编译时解决了这个问题,并告诉你,当你调用 self.display() 时,display() 的使用不明确
它仍然在你的代码中工作的唯一原因可能是因为你创建了两个类型为 test1 和 test2 的变量,并且你已经使用 test1.display() 和 test2.display() 调用了方法,这没有歧义,但这不是你的方式想要使用它不是吗?
所以基本上你永远不会陷入协议的钻石问题:)