面向协议的编程是否带来了遗传问题主要解决的旧代码重复问题?
概观
我试图让我的头脑围绕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"
。 现在,默认扩展中的代码将永远不会被调用。
现在为了提供教学能力和控制能力,我有两种方法,
-
我可以创build另一个协议来模拟控制能力,并将其扩展为主体结构
-
将整个代码复制到
staffProtocol
默认扩展中,staffProtocol
其添加到主体结构的doWork实现中,并添加一行说明也控制其他人员。
问题:
问题与解决scheme1 。 我们遇到类似的问题在inheritance,当需要实现属于两个不同的父类的function,因为不允许多重inheritance,我们用来创build作为一个组件的能力,并将组件作为属性添加到父类我们可以实现多种function而无需实现多重inheritance(反正这是不允许的)。 但苹果说它的代码太多,绝对不是必需的。
即使使用面向协议的编程,如果我不得不通过协议来实现每个function,那么这个问题不是同一个angular落吗? 而不是创造一个能力作为一个组成部分,我不创build它作为一个协议? 该协议如何在这里增加收益?
解决scheme的问题2 。 因为我不能调用协议的默认扩展名,并最终在结构特定的实现中写完整个代码,所以我没有结束代码复制问题,这是inheritance试图解决的常见问题吗?
题
问题我试图find解决scheme不是我怎么解决它? 有100个方法来解决每个问题,我想问的是,
-
协议编程真的是面向对象编程的替代scheme吗?
-
协议真的是inheritance的替代品吗? 如果是的话费用是多less? 写简单的super.doesWork()是明确的或为每个function写一个单独的协议?
我可能完全误解了Protocol-Oriented Programming的概念,请帮我理解一下。