面向协议的编程是否带来了遗传问题主要解决的旧代码重复问题?

概观

我试图让我的头脑围绕Swift的面向协议的编程范例。 根据苹果公司的WWDC 2015videohttps://developer.apple.com/videos/play/wwdc2015/408/协议可以实现inheritance的一切,也可以解决inheritance的基本问题。

虽然协议通过捕获每个function(function)作为协议并允许类/结构来确认多个协议来解决多重inheritance的问题,但是我相信协议不能替代inheritance,原因如下。

让我假设我正在实施学院/学校自动化软件,并有两个实体,工作人员和校长,让我们假设他们都带class上课和校长一起上课控制工作人员。

所以我创build了一个协议,它将模拟正在上课的共同能力。 所以我们来创build一个协议。

protocol staffProtocol { var classHour : Int { get set} var numberOfClass : Int? { get set } mutating func doesWork() } extension staffProtocol { mutating func doesWork(){ classHour = 9 numberOfClass = 4 print("Takes calss") } } 

由于考虑课堂是一个共同的任务,既为工作人员和校长,所以我提供了一个默认的扩展,它提供了一个实施的doesWork()和说上课。

现在我们来写一个Staff结构体,它将会确认给StaffProtocol,

 struct Staff : staffProtocol { var classHour: Int = 0 var numberOfClass: Int? = 0 } 

现在,如果我创build一个工作人员对象

 var staff = Staff() staff.doesWork() 

一切工作绝对好,现在让我们创build一个主体结构,这也将扩大staffProtocol,

 struct Principal : staffProtocol { var classHour: Int = 0 var numberOfClass: Int? = 0 mutating func doesWork() { print("Also controls other staff") } } 

现在随着教学,他也控制其他工作人员,所以如果我重写doesWork()并写下"Also controls other staff" 。 现在,默认扩展中的代码将永远不会被调用。

现在为了提供教学能力和控制能力,我有两种方法,

  1. 我可以创build另一个协议来模拟控制能力,并将其扩展为主体结构

  2. 将整个代码复制到staffProtocol默认扩展中, staffProtocol其添加到主体结构的doWork实现中,并添加一行说明也控制其他人员。

问题:

问题与解决scheme1 。 我们遇到类似的问题在inheritance,当需要实现属于两个不同的父类的function,因为不允许多重inheritance,我们用来创build作为一个组件的能力,并将组件作为属性添加到父类我们可以实现多种function而无需实现多重inheritance(反正这是不允许的)。 但苹果说它的代码太多,绝对不是必需的。

即使使用面向协议的编程,如果我不得不通过协议来实现每个function,那么这个问题不是同一个angular落吗? 而不是创造一个能力作为一个组成部分,我不创build它作为一个协议? 该协议如何在这里增加收益?

解决scheme的问题2 。 因为我不能调用协议的默认扩展名,并最终在结构特定的实现中写完整个代码,所以我没有结束代码复制问题,这是inheritance试图解决的常见问题吗?

问题我试图find解决scheme不是我怎么解决它? 有100个方法来解决每个问题,我想问的是,

  1. 协议编程真的是面向对象编程的替代scheme吗?

  2. 协议真的是inheritance的替代品吗? 如果是的话费用是多less? 写简单的super.doesWork()是明确的或为每个function写一个单独的协议?

我可能完全误解了Protocol-Oriented Programming的概念,请帮我理解一下。