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
协议提供了一系列行为规范信息,允许遵守它的类型可以做什么,即强调了what an object does.;而Struct && Class 对具体事物的抽象,强调了 what an object is?
在面向对象设计时,继承分为两种:接口继承 and 类继承,让我们来看一下两者区别:
2.Protocols vs. Subclassing
2.1 Subclassing
<pre>
class Parent {
//属性
var property: String?
//方法
func function() {
print("My Name is function")
}
//构造
init() {
}
//析构
deinit {
}
}
class Child : Parent {
}
let child = Child()
child.function();
</pre>
从上面代码中,看出Subclassing 定义了parent / child 关系 ,Child作为Parent的子类,继承了Parent的"血统"(属性,方法,初始化等等),当然Child对Parent的特性进行自我改造,升级,所谓的重写 or 覆盖。
2.2 Protocols
Subclassing存在一个缺陷,比如:
<pre>
class Animal {
func makeSound() {}
}
</pre>
动物的叫声各式各样,如果Class Dog : Animal 就需要实现makeSound(),如果忘了呢?
轻则bug,重则Crash.
<pre>
protocol Sound {
func makeSound() ;
}
</pre>
protocol 并不关心what the object really is,我们只关心谁实现了我们的要求~
最后简单,提一嘴: 协议可以模拟实现多继承,另外swift中Extention可以默认实现协议方法~
3.总结
记住:面向协议开发并不是为了替代OOP,而是为了弥补OOP的不足,在开发中不要掉入 唯一编程方法陷阱中~ 我们应该学会灵活,分析每一种方案以及场景的应用~
网友评论