面向协议编程,喵神在博客中有介绍:
面向协议编程与 Cocoa 的邂逅 (上)
面向协议编程与 Cocoa 的邂逅 (下)
Swift和OC的区别、面向协议编程和面向对象编程的优缺点,可以看下面这篇文章:
来一次有侧重点的区分Swift与Objective-C
通过这几篇文章对面向对象编程和面向协议编程有了更深层次的理解,其中包括面向对象存在的三个困境:
1、动态派发的安全性(这应该是OC的困境,在Swift中Xcode是不可能让这种问题编译通过的)
2、横切关注点(Cross-Cutting Concerns)问题。面向对象是一种不错的抽象方式,但是肯定不是最好的方式。它无法描述两个不同事物具有某个相同特性这一点(比如,马继承于动物类,但是又有出行类的特性)。在这里,特性的组合要比继承更贴切事物的本质。
3、菱形问题(比如C++中)。C++可以多继承,在多继承中,两个父类实现了相同的方法,子类无法确定继承哪个父类的此方法,由于多继承的拓扑结构是一个菱形,所以这个问题有被叫做菱形缺陷(Diamond Problem)。
其实,面向对象编程和面向协议编程都各有优缺点,在使用OC编程的过程中,我认为面向对象可以解决99%的问题,另外,1%的问题可以借鉴面向协议编程的方式来解决,比如上面的横切关注点问题。所以,我们在OC编程中可以尝试使用协议和代理的方式去代替继承,比如,将某些特性写成协议,让想拥有该特性的类去实现协议。