0

我有一个基类,它定义了用于返回用于构建服务 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];

它使用基类中的类方法来构建我的端点,而不是我的子类中的类方法。我怎样才能让它不那样做?甚至可能吗?

提前致谢,

缺口

4

3 回答 3

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调用基类的不同方法几乎从来没有做过,并且肯定表明其他事情是错误的。

同样,基类永远不应该尝试专门调用基类中不存在的子类中的功能。

IE

// in base
...
[self doSomething];
...

- (void)doSomething { ; }

// where a subclass might
- (void)doSomething { ... ; [super doSomething]; }
于 2012-06-12T20:07:00.500 回答
0

在您的“buildRequestUrlString”方法中,您的 [self class] 显然属于“基类”类型。

对象继承指南强烈反对尝试从父类访问子类的属性,因为父类(并且应该)不知道子类是否存在。

猜猜,我打字的速度不够快,按照bbum所说的来解决这个问题;)

编辑:这将是一个 hack,与我刚才所说的相反,但您可以将类名作为参数移交:

- (NSString *)buildRequestUrlString:(Class)theClass{
    if (!theClass) theClass = [self class];
    return [Utils serviceEndpointForOperationId:[theClass operationId] version:[theClass operationVersion] andRequestMethod:[theClass methodType]];
}

[super buildRequestUrlString:[self class]];
于 2012-06-12T20:10:29.903 回答
0

我会为此使用模板模式。基本上在你的基类中创建 3 个实例方法来获取你的 operationId 等,在它们只返回 nil 的基类中。然后在您的子类中覆盖这 3 个方法以返回正确的值。

您的 buildRequestUrlString 方法使用 [self operationId] 等。

于 2012-06-12T20:20:18.387 回答