Требуется ли объявление @protocol или что-то еще, чтобы убедиться, что подкласс определяет селекторы? - PullRequest
3 голосов
/ 10 февраля 2012

У меня есть класс, который выполняет некоторый общий код для записи в базу данных. Выводим всплывающие окна, элементы управления и т. Д. Хотя существует много типов элементов, которые я могу записать в базу данных, каждый подкласс должен иметь собственный селектор -(void) writeTagValue для реализации записи элемента.

В базовом классе есть селектор, который выполняет вызов self.writeTagValue, хотя базовый класс на самом деле ничего не пишет, его селектор -(void) writeElement пуст, с abort(); в нем.

Я реализовал протокол в базовом классе. H

@protocol IoUISEWriteAnimation <NSObject>
  -(void) writeTagValue;
  -(IBAction)saWriteValue:(NSNotification *)notification;
@end

добавил протокол к Подклассам, и теперь, если подклассы не определяют селекторы, я получаю предупреждения компилятора.

Я хочу знать, есть ли способ удалить пустой селектор -(void) writeElement в базовом классе?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вы можете сделать что-то вроде этого:

@protocol MyProtocol<NSObject>

@required 
-(void) myRequiredMethod;

@optional
-(void) myOptionalMethod;

@end

А когда вам нужно вызвать дополнительный метод, вы делаете что-то вроде этого:

if ([delegate respondsToSelector:@selector(myOptionalMethod)])
   [delegate myOptionalMethod];
else
   // abort, or ignore.
0 голосов
/ 10 февраля 2012

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

Вы на правильном пути.

...