objective-c - 协议(protocol)真的是父类(super class)的替代品吗?

标签 objective-c swift

我观看了来自 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/

相关文章:

macos - 我将如何快速使用 AVAssetWriter 制作视频?

ios - 有很多嵌套的 UITableViews 是可以的还是有更好的方法来实现这个?

ios - 使用 firebase 获取 UITableview 中的父键

ios - 如何在 NSUserDefaults 中存储 UILabel 的 NSMutableArray

ios - Sqlite 文件为空,但数据可以使用核心数据在模拟器中获取 View

objective-c - setNeedsDisplay *总是*重画吗?

ios - 在图像的 UIScrollview 上显示 UIButton Done

swift - 有没有办法在新通知到达时删除已发送的通知?

iOS,UICollectionViewCell 格式错误的 UILabel

iphone - UITabBarItem 标题不显示