gpt4 book ai didi

ios - 台风初始化程序注入(inject)和调用 super.init()

转载 作者:行者123 更新时间:2023-11-28 07:03:37 25 4
gpt4 key购买 nike

我有一个父类和子类,子类中有一个初始化器,它接受一些参数,然后调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com