我有一个基类,它定义了类方法,用于返回我用来构建服务URL的各种信息。基类还具有为构建该URL而定义的实例方法。我希望基类具有此方法的默认实现,因此当我需要url不同时,我只需要在子类中覆盖它。我如何使用这个基类方法调用重写的类方法来使用子类中的类方法构建url?以下是我现在无法使用的代码:
基类方法:
- (NSString *)buildRequestUrlString{
return [Utils serviceEndpointForOperationId:[[self class]operationId] version:[[self class] operationVersion] andRequestMethod:[[self class] methodType];
}
operationId,operationVersion和methodType是在子类中实现的类方法,但是当子类进行以下调用时:
[super buildRequestUrlString];
它使用基类中的类方法来构建我的端点,而不是我子类中的类方法。我该怎么做呢?它甚至可能吗?
提前致谢,
尼克
答案 0 :(得分:1)
使用self
代替super
。
[self buildRequestUrlString];
(或解释为什么在你的情况下不起作用)。
回应评论,听起来你的课程分解不正确(或者你感到困惑)。具体来说,这可能就是为什么你收到的三个答案都是“使用self
”的原因;我们不明白问题出在哪里。
如果您的基类需要从子类调用实例方法,那么它需要引用子类的实例。即说你有:
@interface Concrete:Base
然后,Base可以实现类方法:
+ baseWithConcreteQuantity:(int)aQuant
{
return [[self alloc] initWithConcreteQuantity:aQuant];
}
它将被用作:
[Concrete baseWithConcreteQuantity:10];
也就是说,Objective-C中的类方法 - 与其他语言中的静态方法不同 - 就像实例方法一样继承。
现在,对于实例方法,您总是从该方法调用super
的特定方法的实现。使用super
调用基类的不同的方法几乎从不完成,并且确实表明其他错误。
类似地,基类不应该尝试专门调用基类中不存在的子类中的功能。
即
// in base
...
[self doSomething];
...
- (void)doSomething { ; }
// where a subclass might
- (void)doSomething { ... ; [super doSomething]; }
答案 1 :(得分:0)
在你的“buildRequestUrlString”方法中,你的[self class]显然属于“基类”类型。
对象继承指南强烈反对尝试从父类访问子类的属性,因为父类已经(并且应该)不知道子类是否存在。
猜猜,我输入的速度不够快,解决这个问题就像bbum说的那样;)
编辑:这是一个黑客,反对我刚才所说的,但你可以将类名作为参数移交:- (NSString *)buildRequestUrlString:(Class)theClass{
if (!theClass) theClass = [self class];
return [Utils serviceEndpointForOperationId:[theClass operationId] version:[theClass operationVersion] andRequestMethod:[theClass methodType]];
}
[super buildRequestUrlString:[self class]];
答案 2 :(得分:0)
我会使用模板模式。基本上在您的基类中创建3个实例方法,以便在基类中获取您的operationId等,它们只返回nil。然后在您的子类中重写这3个方法以返回正确的值。
您的buildRequestUrlString方法使用[self operationId]等。