在Objective-C中调用超类中的“self”

时间:2012-02-03 12:06:36

标签: objective-c inheritance nsxmlparser self

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,或者它只是一个糟糕的设计?

2 个答案:

答案 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];
}