Внедрение инициализатора тайфуна и вызов 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 из них. Есть ли способ, которым я могу сделать эту работу, или мне нужно реорганизовать базовые параметры, чтобы они были свойствами, подобными примеру в документации?
1 ответ
Вы можете наследовать инициализатор от родительского или переопределить его, но, к сожалению, вы не можете расширить инициализатор дополнительными параметрами в дополнение к тем, которые определены в родительском шаблоне.
Предлагаемые альтернативы:
Используйте свойство инъекции
Обычно мы рекомендуем использовать внедрение инициализатора, так как оно позволяет создавать неизменяемые объекты и проверять состояние после построения. Эти недостатки в внедрении свойств могут быть устранены путем:
- Укажите метод обратного вызова, который будет использоваться после введения свойств.
- Для экземпляров, которые разработаны как неизменяемые, объявите свойства как предназначенные только для чтения и записи, но доступные только для чтения.
Используйте композицию, а не наследование
Другое предложение состоит в том, чтобы создать определение соответствующей области, которое инкапсулирует конфигурацию, которая имеет тенденцию использоваться вместе, и внедрить это.
В зависимости от ситуации это может быть выгодно - есть много хороших статей о "состав против наследования" и когда каждый уместен.