2010-07-28 4 views
3

У меня есть класс Child, унаследованный от класса Parent. Я хочу отправить сообщение ребенку, в котором реализовано это сообщение. Так что это как вызов чистой виртуальной функции от родителя. Если я отправлю сообщение от родителя, я получу предупреждение о том, что родитель может не отвечать на это сообщение. Это правда, потому что только у Ребенка есть его реализация.Отправка сообщения ребенку из родителя

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

Не могу поверить, что с помощью наследования я все равно придется использовать делегаты ...

ответ

4

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

if ([self respondsToSelector:@selector(onCancel)]) { 
    [self onCancel]; 
} 

Если вы хотите избавиться от предупреждения, используйте -performSelector:.

if ([self respondsToSelector:@selector(onCancel)]) { 
    [self performSelector:@selector(onCancel)]; 
} 
+0

Возможно, вам удастся устранить предупреждение, набрав self, чтобы напечатать 'id', что приведет к значительно более быстрому выполнению, чем использование функции performSelector: – JeremyP

0

Наследование не устраняет необходимость делегирования. Это взаимоисключающие аспекты ООП. Мне кажется, что вы действительно пытаетесь реализовать делегата. Классы, которые он делегирует, не должны быть подклассами, а дискретными классами. Здесь вам нужна композиция, а не наследование.

1

Если не тот, кто не понимает вашу проблему. Если оба родителя и ребенка реализуют код onCancel, почему бы не просто позвонить [super onCancel] внутри дочерних элементов onCancel, и это будет выполнено до того, как будет выполнен код ребенка.

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