You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:36:02