我观看了来自 WWDC15 的面向协议(protocol)的编程视频。看到这个视频后,我很困惑。谁能给我一个相关的例子来说明这个想法?
此外,协议(protocol)扩展是对运算符重载的真正替代。
最佳答案
在动态类型语言(Ruby、Python、Javascript 等)中有“duck typing”的概念,本质上说对象的实际类型是什么并不重要,只要它响应特定的方法。而不是检查 instance_of?
, 你可以查看 responds_to?
当您使用检查来确定是否可以调用方法时,这更相关。
协议(protocol)只是鸭子类型的正式声明。由于您要求提供示例(代码是 Ruby,它是动态类型的 — 如果您不熟悉 Ruby,只需将其视为伪代码并想象所有类型为 id
并且返回值为 void
):
假设我们正在构建一个程序来模拟交通。我们可能有几种不同的交通方式:
class Bicycle
def goto(x, y)
# Implementation details
end
end
class Car
def goto(x, y)
# Implementation details
end
end
class Boat
def goto(x, y)
# Implementation details
end
end
class Jetpack
def goto(x, y)
# Implementation details
end
end
所有这些类都是 Vehicle
的子类可能没有意义父类,自Jetpack
将具有与 Bicycle
截然不同的属性和实现细节.但请注意,所有这些类都会响应 goto(x, y)
方法。创建另一个也响应此方法的类(例如 Helicopter
)会很容易。
现在假设我们正在使用这些类之一:
class Person
def travel(vehicle, destination)
vehicle.goto(destination.x, destination.y)
end
end
无论是否 vehicle
,这段代码都可以工作是 Bicycle
, Boat
,或将来定义的其他一些类,因为此代码正在调用协议(protocol)方法而不是类型方法。
关于objective-c - 协议(protocol)真的是父类(super class)的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477756/