使用Protocol共享实现:无需继承复用FirstPresenter逻辑给SecondPresenter
最优功能共享方案参考
方案1:协议默认实现自动转发(推荐,符合不用继承、减少重复代码的需求)
你可以新增一个持有FirstPresenter实例的中间协议,给协议扩展写一次全局转发逻辑,后续所有需要复用FirstPresenter能力的类都不需要再重复写方法调用代码:
第一步:定义中间协议与默认转发扩展
// 中间协议默认继承原PresenterProtocol protocol FirstPresenterHolder: PresenterProtocol { var firstPresenter: PresenterProtocol { get } } // 统一实现所有PresenterProtocol方法的转发逻辑 extension FirstPresenterHolder { func one() { firstPresenter.one() } func two() { firstPresenter.two() } func third() { firstPresenter.third() } }
第二步:实现SecondPresenter
class SecondPresenter: FirstPresenterHolder { // 满足协议要求的属性 var firstPresenter: PresenterProtocol = FirstPresenter() // 仅需要实现自己新增的两个方法即可 func additionalFunction1() { // 自定义逻辑 } func additionalFunction2() { // 自定义逻辑 } // 若需要给某个原有方法添加额外逻辑,单独重写即可,其余方法仍使用默认转发 // func one() { // firstPresenter.one() // // 额外业务逻辑 // } }
注意:你原代码中SecondPresenter遵守的PresenterProtocols多了后缀s,属于拼写错误,正确应为PresenterProtocol
不同方案优劣对比
- 手动转发方案(你当前的写法):适合协议方法少、仅需要单次复用的场景,逻辑直观可控,缺点是方法较多时重复代码量大,协议增删方法时需要同步修改所有转发类,维护成本高。
- 协议默认转发方案:仅需要写一次转发逻辑,后续所有需要复用FirstPresenter能力的类都可以直接遵守
FirstPresenterHolder协议使用,维护成本低,完全符合面向协议编程的要求,是当前场景下的最优解。 - 直接给
PresenterProtocol加默认实现的方案不适用于当前场景:默认实现会作用于所有遵守该协议的类,会和FirstPresenter的自定义实现冲突,也无法绑定具体的FirstPresenter实例完成逻辑复用。
内容的提问来源于stack exchange,提问作者jackbob
相关产品推荐
相关产品推荐

