swift - Swift 中的类类型工厂
问题描述
有没有办法创建一个类类型工厂?
我的代码目前看起来像这样(过于简单):
var blah: BaseObject? //has function "setup()"
switch(objectType) {
case .one
blah = Object1() //inherits BaseObject overrides "setup()"
case .two
blah = Object2() //inherits BaseObject overrides "setup()""
...
}
blah?.setup()
但是,我想知道我是否可以将其更改为这样的东西?
let blah: getClassType(from: objectType) = BaseObjectBuilder.create()
// uses something like: static func create<T: BaseObject>() -> T
“setup()”将移至 create() 方法
这部分似乎是杀手:getClassType(objectType)
能够根据某些参数定义类类型吗?如果这是不可能的,有没有人有不同的建议来清理它?
解决方案
我不太明白你在追求什么,但通常的工厂模式对我来说似乎很干净:
class BaseObject {
func setup() { print("base object setup") }
required init() {}
static func factory() -> Self {
let obj = self.init()
obj.setup()
return obj
}
}
class Object1 : BaseObject {
override func setup() { print("object1 setup") }
}
class Object2 : BaseObject {
override func setup() { print("object2 setup") }
}
这是有效的,因为 Self 是多态的。这是一个示例,表明它做了正确的事情:
// I want a new Object1
let obj1 = Object1.factory()
// obj1 is typed as Object1, and "object1 setup" was printed
推荐阅读
- vb.net - 具有 Winforms / bindingsource 的实体 - 无法保存来自控件的用户输入
- google-kubernetes-engine - 如何使用 Helm 更新 GKE 集群上运行的工作负载的 ConfigMap?
- python - 如何从两个numpy数组元素中插入一维数组
- angularjs - 使用 Identity Server 和 Angular 应用程序获取 CORS 策略错误
- python-3.x - 如何在 Python 3 中播放具有开始时间和结束时间的 MP3 文件的最佳方式是什么
- excel - Table.ListRows.Add 在我的计算机上正常工作,但在我们的 20 台计算机化学实验室中没有其他计算机
- ember.js - 在 ember mocha 中使用 before all hook 时出现 TypeError
- scrapy - scrapy-splash 爬虫启动速度快但速度慢(不受网站限制)
- c# - 为什么Web应用程序找不到目录?
- intellij-idea - 在格式上禁用 IntelliJ 拆分行注释