繁体   English   中英

台风初始化程序注入并调用super.init()

[英]Typhoon initializer injection & calling super.init()

我有一个父子类和一个子类,在子类中有一个初始化程序,该初始化程序接受一些参数,然后调用super.init()从基类中初始化属性。

因为我有很多子类,所以我想重用代码来注入参数,但是我想不出在基类定义中注入一些成员而在子类定义中注入其余成员的方法。

我尝试了以下方法:

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个参数的初始化程序,但只注入了2个参数。 有什么方法可以使这项工作有效,还是必须将基本参数重构为类似于文档中示例的属性?

您可以从父级继承初始值设定项或对其进行覆盖,但是不幸的是,除了在父模板中定义的参数外,您不能使用其他参数扩展初始值设定项。

建议的替代方案:

使用属性注入

通常,我们建议使用初始化器注入,它允许创建不可变对象并在构造后进行状态验证。 可以通过以下方法解决属性注入中的这些缺点:

  • 指定在注入属性后要使用的回调方法
  • 对于设计为不可变的实例,请将属性声明为内部可读写,但外部为只读。

使用组合而不是继承

另一个建议是创建一个适当范围的定义,该定义封装倾向于一起使用的配置并将其注入。

根据情况的不同,这可能是有利的-关于“组成与继承”以及何时适当,有很多不错的文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM