2015-07-14 2 views
1

У меня есть родительский и дочерний класс и инициализатор в дочернем классе, который принимает некоторые параметры, а затем вызывает 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

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

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

Инъекции Использование недвижимости

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

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

Применение композиции, а не удел

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

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

+0

Спасибо. Немного о боковом вопросе - вы хотите добавить эту функциональность в более новые версии фреймворка? –

+0

В настоящее время он не находится в нашем отставании, но вы можете его запросить. –

 Смежные вопросы

  • Нет связанных вопросов^_^