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_
相关产品推荐
相关产品推荐

