簡體   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