面向对象的设计和面向协议的设计都使用了多态让我们使用同样的接口来跟不同的类型进行交互。在面向对象的设计中,我们使用了基类提供的接口来跟所有的子类进行交互。在面向协议的设计中,我们使用了协议和协议扩展提供的接口来跟遵守该协议的类型进行交互。
两种设计方式写出的代码都很好而且易懂。但个人感觉协议/协议扩展代码更好,因为协议/协议扩展的方法整体更干净和易懂些。
当我们谈到面向协议编程的时候应该从协议开始构思而不是从基类开始。然后我们可以使用协议扩展来为遵守该协议的类型添加功能,而对于面向对象编程,我们还得从基类开始。
在面向协议设计中我们更多的使用了值类型(结构体struct)而非引用类型(类class)。Apple已经说了我们应该在合适的地方尽可能地偏好使用值类型而非引用类型。
【struct与class的区别会在下一篇博客中讲到】
协议/协议扩展相比基类有 3 个优点:
第一个优点是类型可以遵守多个协议而只能拥有一个基类。这意味着我们可以创建很多个协议以添加每个特定的功能而不是把所有功能都写到一个巨大的类中。例如,使用一个的 People 协议,我们还能创建包含特定需求和功能的 Teacher、Fireman、和 Doctor 协议。然后,English Teacher 和 Surgery Doctor 类型会遵守 People、Teacher 和 Doctor 协议。使用基类, 我们需要把定义在 People、Teacher 和 Doctor 协议中的功能组合到单个巨大的超类中。这种类如果足够庞大也常被称为上帝类,容易造成遍地bugs的后果,耦合度太高。
第二个优点是我们不需要源代码就可以使用协议扩展来添加功能。这意味着我们可以扩展任何协议,即使是 Swift 自己内建的协议也能扩展。而给超类添加功能我们需要知道源代码。我们可以使用扩展给超类添加功能