San*_*ari 7 inheritance protocols ios swift
概观
我试图了解Swift的面向协议编程范例.根据Apple的WWDC 2015视频https://developer.apple.com/videos/play/wwdc2015/408/协议可以实现继承所能实现的一切,并且还解决了继承的根本问题.
虽然协议通过将每个功能(功能)捕获为协议并允许类/结构确认多个协议来解决多重继承的问题,但我认为协议永远不能替代继承,原因如下.
让我们假设我正在实施学院/学校自动化软件,并且有两个实体,工作人员和校长,我们假设他们都上课但是校长以及课程控制员工.
所以我创建了一个协议,它将模拟正在上课的常用功能.所以让我们创建一个协议.
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")
}
}
Run Code Online (Sandbox Code Playgroud)
由于Take class是工作人员和校长的共同任务所以我提供了一个默认扩展,它提供了一个实现,doesWork()
并说类需要.
现在让我们编写一个Staff结构,它将向staffProtocol确认,
struct Staff : staffProtocol {
var classHour: Int = 0
var numberOfClass: Int? = 0
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我创建一个staff对象
var staff = Staff()
staff.doesWork()
Run Code Online (Sandbox Code Playgroud)
一切都运行得很好,现在让我们创建一个Principal结构,它也将扩展staffProtocol,
struct Principal : staffProtocol {
var classHour: Int = 0
var numberOfClass: Int? = 0
mutating func doesWork() {
print("Also controls other staff")
}
}
Run Code Online (Sandbox Code Playgroud)
现在,除了教学,他还控制其他员工,所以如果我覆盖doesWork()
和写"Also controls other staff"
.现在永远不会调用默认扩展中的代码.
现在为了提供教学能力和控制能力,我有两种方法,
我可以创建另一个协议,它将模拟控制功能并使主结构扩展它
将默认扩展名中的整个代码复制 staffProtocol
到主体结构的doWork实现中,并添加一行表示也控制其他人员.
问题:
解决方案1的问题.我们在继承中面临类似的问题,当需要实现属于两个不同父类的功能时,并且由于不允许多重继承,我们习惯于将该功能创建为组件并将组件作为属性添加到父类中,以便我们可以实现多种功能而无需实现多重继承(无论如何不允许).但苹果说它的代码太多了,绝对不是必需的.
即使是面向协议的编程,如果我必须实现每个功能作为一个协议是不是遇到问题的同一角落?我没有将其创建为协议,而不是创建作为组件的功能?该协议如何在这里增加收益?
解决方案的问题2.因为我无法调用协议的默认扩展并最终再次在结构特定的实现中编写整个代码,所以我最终没有遇到代码重复问题,这是继承尝试解决的常见问题吗?
题
问题我试图找到解决方案不是我怎么解决它?有100种方法可以解决每个问题,我想问的是,
协议编程真的是面向对象编程的替代方案吗?
协议真的是继承的替代品吗?如果是,费用是多少?简单地写super.doesWork()是清楚的,还是为每个功能编写一个单独的协议?
我可能完全误解了面向协议编程的概念,请帮我理解一下.
(虽然参加聚会已经很晚了。我在了解了一些关于 的初级知识后遇到了这个帖子POP
)
假设您要编写一些鸟类类。喜欢:
\n\n它们有的能飞,有的不能。在 OOP 中,您有多种设计选项。最常见的是:
\n\nYou design a base class Fly, then by subclassing it you design Bird and then you use this Bird as the base class for all the bird classes in the question. Override the flying/not flying behavior for each bird type.
Or, you can have a base class Fly, you subclass it for FlyingBird. And then you have another base class NotFlyingBird. After that you subclass these two classes according to your need.
The above approaches work. But you see for the case 1:
\n\n\n\n\nEvery time you create a new bird, you are also inheriting some capabilities that you don\'t need maybe.
\n
And in the case 2:
\n\n\n\n\nYou create two separate base class of your need! What if you need to write something common for FlyingBird and NotFlyingBird? You will probably end up changing your mind to use the approach 1 here.
\n
And lastly, every time you change your mind in later time you end up inheriting from different base class. Or just adding all of the behaviors in a god-like class
\n\nNow see, how you can design this with POP
approach.
protocol Flyable { ... }\nprotocol Bird { ... }\n\nstruct Flappy: Bird, Flyable { ... } //it\'s a bird & can fly\nstruct SwiftBird: Bird, Flyable { ... } //it\'s a bird & can fly\nstruct Stork: Bird, Flyable { ... } //it\'s a bird & can fly\nstruct Penguin: Bird { ... } //it\'s a bird but can\'t fly\nstruct Ostrich: Bird { ... } //it\'s a bird but can\'t fly\nstruct Eagle: Bird, Flyable { ... } //it\'s a bird & can fly\n
Run Code Online (Sandbox Code Playgroud)\n\n看!如何POP
真正发光?所以,\xe2\x80\x99 你没有采用继承方法是一件好事,毕竟让所有的鸟都能飞!
使用面向协议的编程,您不会神奇地继承Super 类的所有内容。你正在强迫自己提供。通过这种方法,您可以添加行为. So you can keep out the burden off your shoulder.
\n\n\n\n\n如果您需要任何非常新的东西,您只需添加到它们中,而不是在未经他们实际同意的情况下强制其他人拥有该非常新的东西。.
\n
介绍Swift 3 中的面向协议编程 article from RayWenderlich may even lighten up you a bit more.
\n\n你甚至可以看看这个答案 from a different thread.
\n\n让我们简短地回答您的后续问题:
\n\n->
Not always. But it has it\'s shine.->
再说一次,不。但是!!如果您是从头开始设计,那么尝试一下这个想法是值得的。 归档时间: |
|
查看次数: |
487 次 |
最近记录: |