Внедрение инициализатора тайфуна и вызов 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 ответ

Решение

Вы можете наследовать инициализатор от родительского или переопределить его, но, к сожалению, вы не можете расширить инициализатор дополнительными параметрами в дополнение к тем, которые определены в родительском шаблоне.

Предлагаемые альтернативы:

Используйте свойство инъекции

Обычно мы рекомендуем использовать внедрение инициализатора, так как оно позволяет создавать неизменяемые объекты и проверять состояние после построения. Эти недостатки в внедрении свойств могут быть устранены путем:

  • Укажите метод обратного вызова, который будет использоваться после введения свойств.
  • Для экземпляров, которые разработаны как неизменяемые, объявите свойства как предназначенные только для чтения и записи, но доступные только для чтения.

Используйте композицию, а не наследование

Другое предложение состоит в том, чтобы создать определение соответствующей области, которое инкапсулирует конфигурацию, которая имеет тенденцию использоваться вместе, и внедрить это.

В зависимости от ситуации это может быть выгодно - есть много хороших статей о "состав против наследования" и когда каждый уместен.

Другие вопросы по тегам