Swift 编程:面向对象与面向协议的对比分析
1. 面向协议编程概述
在编程中,面向对象编程通常从思考对象和类层次结构开始设计,而面向协议编程则有所不同,它从思考协议开始。不过,面向协议编程不仅仅关乎协议本身。
在当前示例中,若要以面向协议编程的方式重新设计解决方案,需要重新思考两个方面:
- Drink 类 :面向协议编程建议从协议而非超类开始。因此,将 Drink 类转变为 Drink 协议,并使用协议扩展为符合该协议的饮料类型添加通用代码。
- 引用(类)类型的使用 :Swift 中,苹果建议在适当的情况下优先使用值类型而非引用类型。在本示例中,饮料类型(如 Jolt 和 CaffeineFreeDietCoke)使用值(结构体)类型,而 Cooler 类型使用引用(类)类型。这是因为饮料类型的实例通常只有一个所有者,而 Cooler 类型的实例可能会有代码的多个部分与之交互。
以下是引用类型和值类型传递实例时的区别:
| 类型 | 传递实例方式 | 更改影响 |
| ---- | ---- | ---- |
| 引用类型 | 传递对原始实例的引用 | 更改会反映在所有引用中 |
| 值类型 | 传递原始实例的新副本 | 一个实例的更改不会反映在其他实例中 |
2. 面向协议编程示例实现
首先创建 Drink 协议:
protocol Drink {
var volume: Double {get set}