Называя себя в суперклассе в Objective-C - PullRequest
1 голос
/ 03 февраля 2012

Суперкласс - это класс NSOperation, который реализует NSXMLParserDelegate - все, что он делает, это отправляет URL-запрос и анализирует данные XML, возвращаемые с сервера.Этот класс наследуется подклассом, который также реализует NSXMLParserDelegate.Предполагается, что родительский делегат синтаксического анализатора отлавливает общую ошибку из XML-ответа, прежде чем передать его делегатскому дочернему синтаксическому анализатору для более детального анализа.

@implementation Sub

// main is not overidden in subclass

// and this should return parser delegate in the sub class
- (id) getParserDelegate {
     return self;
}

@end

Я создаю экземпляр операции, используя дочерний класс, т. Е. Sub

Sub *theSub = [[Sub alloc] init];
[self.queue addOperation:theSub]; // Super's main method will be called

В рамках основного метода Super я хотел бы иметь доступ как к родительскому, так и дочернему делегату, но я обнаружил, что'self' всегда разрешается в Sub, независимо от того, вызывается ли 'self' в Sub или Super.Можно ли вызвать функцию getParserDelegate в Super из главного Super или это просто плохой дизайн?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

self - указатель непосредственно на объект. Таким образом, он разрешает одно и то же, независимо от того, где вы проверяете его в цепочке наследования. Не существует такого понятия, как указатель self, который бы разрешал непосредственно в суперклассе - в этом разница между «школой расширения функциональности объекта» и «имеет».

Любые сообщения, отправленные на self, всегда будут сначала отправляться в самый младший дочерний класс, а затем работать в соответствии с обычными правилами наследования. В результате вы не можете предоставить NSXMLParser абсолютно ничего, что могло бы привести к тому, что методы делегата переместились бы прямо в суперкласс.

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

0 голосов
/ 03 февраля 2012

Суперкласс никогда не знает о том, чем занимаются его дети и чем они занимаются.

//in Super.h
- (id) getParserDelegate;

//in Super.m
- (id) getParserDelegate {
    return self;
}

//in Child.h
- (id) getParserDelegate;

//in Child.m
- (id) getParserDelegate {
    return [super getParserDelegate];
}
...