1.什么是Protocol
官方給出了如下解釋:
A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements. Any type that satisfies the requirements of a protocol is said to conform to that protocol.
– The Swift Programming Language Guide by Apple
協(xié)議提供了一系列行為規(guī)范信息剑肯,允許遵守它的類型可以做什么,即強(qiáng)調(diào)了what an object does.巢寡;而Struct && Class 對具體事物的抽象聘裁,強(qiáng)調(diào)了 what an object is胸墙?
在面向?qū)ο笤O(shè)計(jì)時(shí),繼承分為兩種:接口繼承 and 類繼承,讓我們來看一下兩者區(qū)別:
2.Protocols vs. Subclassing
2.1 Subclassing
<pre>
class Parent {
//屬性
var property: String?
//方法
func function() {
print("My Name is function")
}
//構(gòu)造
init() {
}
//析構(gòu)
deinit {
}
}
class Child : Parent {
}
let child = Child()
child.function();
</pre>
從上面代碼中书闸,看出Subclassing 定義了parent / child 關(guān)系 ,Child作為Parent的子類利凑,繼承了Parent的"血統(tǒng)"(屬性浆劲,方法,初始化等等)哀澈,當(dāng)然Child對Parent的特性進(jìn)行自我改造牌借,升級,所謂的重寫 or 覆蓋割按。
2.2 Protocols
Subclassing存在一個(gè)缺陷膨报,比如:
<pre>
class Animal {
func makeSound() {}
}
</pre>
動(dòng)物的叫聲各式各樣,如果Class Dog : Animal 就需要實(shí)現(xiàn)makeSound(),如果忘了呢?
輕則bug现柠,重則Crash.
<pre>
protocol Sound {
func makeSound() ;
}
</pre>
protocol 并不關(guān)心what the object really is院领,我們只關(guān)心誰實(shí)現(xiàn)了我們的要求~
最后簡單,提一嘴: 協(xié)議可以模擬實(shí)現(xiàn)多繼承晒旅,另外swift中Extention可以默認(rèn)實(shí)現(xiàn)協(xié)議方法~
3.總結(jié)
記渍っぁ:面向協(xié)議開發(fā)并不是為了替代OOP,而是為了彌補(bǔ)OOP的不足,在開發(fā)中不要掉入 唯一編程方法陷阱中~ 我們應(yīng)該學(xué)會(huì)靈活废恋,分析每一種方案以及場景的應(yīng)用~