协议默认实现可以覆盖方法吗?

时间:2015-06-28 07:49:48

标签: swift protocols

从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后缀)。

1 个答案:

答案 0 :(得分:2)

从我记得的WWDC视频中,如果一个类为一个也有一个协议默认实现的方法提供了一个实现,那么该类中的一个获胜。即协议的实现仅在类没有提供时才使用。

IMO,如果这是另一种方式(或者如果有另一种方法通过协议实现覆盖类实现),那将打开一些讨厌的大门。例如。突然标准框架功能因此而有所不同。

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