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

Swift中如何让基类静态方法返回调用该方法的子类实例(支持批量返回)

解决方案

核心思路

  • 用Self动态指代当前调用静态方法的类类型,代替硬编码的Base()
  • 给基类的无参构造器添加required标记,强制所有子类实现该构造器,保证编译安全,你注释中无法编译的代码添加该标记后即可正常运行

完整实现代码

class Base {
    func f() {
        print("base class")
    }
    
    // 标记required,要求所有子类必须实现该无参构造器
    required init() {}
    
    // 返回单个子类实例
    static func createSubclassObject() -> Self {
        // 此处可添加通用业务逻辑,比如实例化后的统一配置
        return Self()
    }
    
    // 批量返回子类实例
    static func createSubclassObjects(count: Int) -> [Self] {
        var objects = [Self]()
        for _ in 0..<count {
            let instance = Self()
            // 此处可添加批量实例的通用处理逻辑
            objects.append(instance)
        }
        return objects
    }
}

子类不需要修改任何代码,直接继承基类即可:

class Sub: Base {
    override func f() {
        print("sub class")
    }
}

测试效果

print(Sub.createSubclassObject().f())
// 输出 sub class

Sub.createSubclassObjects(count: 2).forEach {
    print($0.f())
}
// 输出两次 sub class

补充说明

  • 所有通用逻辑可以全部写在基类的静态方法中,3个子类都不需要重写任何create相关方法,直接继承即可使用,不会产生重复代码
  • 如果子类需要自定义构造参数,只需要在基类中声明对应的required构造器,所有子类实现后,静态方法的逻辑不需要做任何修改

内容的提问来源于stack exchange,提问作者user_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:57:03