2015-12-27 5 views
0

Моего класса А инициализируется так:Вызова кода настройки суперкласс

- (instancetype)init // designated initializer 
{ 
    self = [super init]; 

    if (self) { 
     [self setup]; // just sets some properties 
    } 

    return self; 
} 

У меня есть следующий класс B, который подклассы:

- (instancetype)init 
{ 
    self = [super init]; // calls the initializer of A and SHOULD call the setup code of A but it does not 

    if (self) { 
     [self setup]; // just sets some properties for B 
    } 

    return self; 
} 

Моя проблема:

B должен вызывать метод установки A, но это происходит не из-за динамического ввода Objective-C. Вместо этого B называет свой код настройки дважды.

Как решить эту проблему (помимо переименования методов) или даже лучше? ЛЮБЫЕ ЛУЧШИЕ ПОДХОДЫ?


Я мог бы переместить код, написанный в setup для init, но проблема в том, что у меня есть более чем один назначенный инициализатору (например: UIViewControllers имеет initWithFrame: и initWithCoder:) и я ленив о написании кода дважды.

ответ

1

Я не уверен, почему вы отказываетесь от переименования методов. Это простое решение.

Другим подходом является использование функций вместо методов. Функции отправляются статически, а не динамически.

Например, в реализации A:

static void setup(A* self) 
{ 
    self.someProperty = /* ... whatever ... */; 
} 

- (instancetype)init // designated initializer 
{ 
    self = [super init]; 

    if (self) { 
     setup(self); // just sets some properties 
    } 

    return self; 
} 

Аналогично для B.

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

Предполагая, что функция находится внутри @implementation, у нее есть полный доступ к объекту, в том числе к частным переменным экземпляра. Таким образом, setup() может использовать self->_someProperty вместо self.someProperty.

+0

Спасибо! Моя проблема с переименованием заключается в том, что это как-то показывает, что этот подход не самый красивый способ настройки некоторых свойств. Вот почему я скорее ищу другие идеи, как это сделать. – Duc

1

Как насчет простого подхода? Сделать setup в B позвонить [super setup] и не звонить setup в B.

+0

К сожалению, настройка - это частный метод. – Duc

+1

@Duc Частью вы, вероятно, имеете в виду «не объявлено в заголовке». Как сделать его видимым во внутренней категории? Вы сможете переопределить его. – Sulthan

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