Superclass是一个实现NSXMLParserDelegate的NSOperation类 - 它所做的就是发送URL请求并解析从服务器返回的XML数据。该类由子类继承,该子类也实现NSXMLParserDelegate。父代的解析器委托应该从XML响应中捕获一般错误,然后再将其传递给子的解析器委托,以进行更具体的解析。
在超类中:
@implementation Super
#pragma mark NSOperation method
- (void) main {
id parentDelegate = [self getParserDelegate]; //?
id childDelegate = [self getParserDelegate]; //??
}
// I would like this to return parser delegate in the super class
- (id) getParserDelegate {
return self;
}
@end
在子类中:
@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,无论是在Sub还是Super中调用'self'。是否有可能从Super的主要内部调用Super的getParserDelegate,或者它只是一个糟糕的设计?
答案 0 :(得分:4)
self
是一个直接指向对象的指针。因此,无论您在继承链中检查它,它都会解决相同的问题。没有self
指针可以直接解析超类 - 这就是'是'一个'扩展对象功能的学校和'有一个'之间的区别。
发送给self
的任何消息将始终首先发送到最初级的子类,然后按照通常的继承规则继续工作。因此,您可以向NSXMLParser
提供任何不会导致委托方法直接进入超类的内容。
我建议你用一个实现大部分逻辑的公共actor和一个执行特定细节的独立actor来描述的内容本身就是委托模式。所以你可能想要的是把你现在作为父母的东西变成自己的主权阶级,并将你现在作为孩子的东西作为代表加入其中。如果有意义,只需为该委托关系重用NSXMLParserDelegate
协议。
答案 1 :(得分:0)
超级班从来不知道孩子是什么,以及他们做了什么。
//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];
}