我有一个父类和子类,子类中有一个初始化器,它接受一些参数,然后调用 super.init() 来初始化基类的属性。
因为我有很多子类,所以我想重用代码来注入(inject)参数,但是我想不出一种方法来将一些成员注入(inject)基类定义中,而其余成员则注入(inject)子类定义中.
我尝试了以下方法:
public dynamic func baseManager() -> AnyObject {
return TyphoonDefinition.withClass(BaseManager.self) {
(definition) in
definition.useInitializer("initWithBaseParam1:baseParam2:") {
(initializer) in
initializer.injectParameterWith(self.baseParam1())
initializer.injectParameterWith(self.baseParam2())
}
}
}
public dynamic func authenticationManager() -> AnyObject {
return TyphoonDefinition.withClass(AuthenticationManager.self) {
(definition) in
definition.parent = self.baseManager()
definition.useInitializer("initWithChildParam1:childParam2:baseParam1:baseParam2:") {
(initializer) in
initializer.injectParameterWith(self.childParam1())
initializer.injectParameterWith(self.childParam2())
}
}
}
但是我得到一个错误,我使用了一个带有 4 个参数的初始化器,但只注入(inject)了其中的 2 个。有什么方法可以完成这项工作,还是我必须将基本参数重构为类似于文档中示例的属性?
最佳答案
您可以从父模板继承初始化器或覆盖它,但不幸的是,您不能使用父模板中定义的参数之外的额外参数扩展初始化器。
建议的备选方案:
使用属性注入(inject)
通常我们建议支持初始化器注入(inject),它允许创建不可变对象(immutable对象)并在构造后进行状态验证。属性注入(inject)中的这些缺点可以通过以下方式解决:
- 指定 a callback method在注入(inject)属性后使用。
- 对于设计为不可变的实例,将属性声明为内部可读写,但外部只读。
使用组合而不是继承
另一个建议是创建一个适当范围的定义,封装倾向于一起使用的配置并注入(inject)它。
根据具体情况,这可能是有利的 - 有很多关于“组合与继承”的好文章以及每篇文章的合适时机。
关于ios - 台风初始化程序注入(inject)和调用 super.init(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405215/