【问题标题】:Can a method be overridden by protocol default implementation?协议默认实现可以覆盖方法吗?
【发布时间】:2015-06-28 07:49:47
【问题描述】:

从 Swift 2 开始,可以在协议中为将实现这些协议的类提供我们自己的方法实现 (protocol default implementation)。但是我们可以覆盖现有的方法吗?

在我看来,Swift 2 中的协议看起来像是协议 + 类别的混合体。虽然总的来说它很好并且开始促进基于组合的编程而不是基于继承的编程,但是我缺乏覆盖现有方法的可能性,因此具有完全的控制和灵活性并具有完全的组合。这意味着能够使用默认实现获取一堆协议,为我的类添加所需的行为(并在需要时覆盖)。如果不能直接解决,也许有办法解决这个问题?

更新。我想这样做的原因是我不喜欢使用 UITableViewController 和 UICollectionViewController。相反,我有自己的顶级超类 CoreViewController 和几个二级基类(BaseViewController、BaseDetailsViewController 和 BaseWebViewController),其中包含所有常见的共享代码。是的,这是继承,我希望使用组合有一个不同的实现,因此我喜欢 Swift 2 的协议方法。这样我就可以使用 UITableViewController(带有静态单元格)并且仍然附上我的通用代码。但是,我需要能够覆盖其方法,例如 alloc。我有一个非常简单的(这个方法的实现)[https://github.com/GitTennis/SuccessFramework/blob/master/Templates/BusinessApp/BusinessApp/Core/CoreViewController.m],它可以智能地为我的通用应用程序自动选择正确的视图控制器类(我所有的视图控制器都有 _ipad 或 _iphone 后缀)。

【问题讨论】:

  • 如果你想使用默认的协议实现,你不能在你的具体类型中不提供那个方法吗?或者我没有正确理解你的问题;你能提供一些示例代码吗?
  • @ABakerSmith 检查我的更新

标签: swift protocols


【解决方案1】:

根据我从 WWDC 视频中回忆的内容,如果一个类为一个方法提供了一个实现,该方法也具有协议默认实现,那么该类中的那个会获胜。 IE。协议的实现仅在类不提供时使用。

IMO,如果这是另一种方式(或者如果有另一种方式通过协议实现覆盖类实现),那将打开一些讨厌的门。例如。突然之间,标准框架功能的工作方式就不同了。

无论如何,您为什么要通过协议默认实现覆盖现有的类方法?

【讨论】:

  • 为什么不定义一个您的视图控制器层次结构能够嵌入/使用的协议,然后扩展/继承来自 Apple 的标准视图控制器来实现这样的协议?
  • 这将导致代码重复,一个代码将位于 UITableViewController 的子类中,另一个副本将位于 UICollectionViewController 的子类中,第三个副本将位于自定义超类中。在我的框架中,我所有的 viewControllers 都是从 CoreViewController 扩展而来的(比如 NSObject)。但这样做的代价是我不能将 UITableViewController 与静态单元格一起使用。
  • 您可能想尝试扩展 UIViewController 类以采用您的协议,这将使其所有子类也自动继承此行为。这至少可以最大限度地减少代码的重复。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2017-08-13
  • 2014-07-07
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多