当前位置: 首页 > 知识库问答 >
问题:

在超类的子类中重写的调用方法

狄楷
2023-03-14

我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用:

基类方法:

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

op ationId、operationVersion和方法类型是在子类中实现的类方法,但是当子类进行以下调用时:

[super buildRequestUrlString];

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

提前谢谢,

尼克

共有3个答案

亢雅懿
2023-03-14

在你的"build dRequest estUrlString"方法中,你的[自类]显然属于"基类"类型。

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

我猜,我打字速度不够快,无法解决这个问题。按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]];
衡子安
2023-03-14

我会使用模板模式来实现这一点。基本上,在基类中创建3个实例方法来获取operationId等。在基类中,它们只返回nil。然后在子类中重写这3个方法以返回正确的值。

buildRequestUrlString方法使用[self-operationId]等。

薛浩言
2023-03-14

使用self而不是super

[self buildRequestUrlString];

(或者解释为什么这在你的情况下不起作用)。

回应评论,听起来你的类分解不正确(或者你很困惑)。具体来说,这可能是为什么你收到了三个答案,都是“使用<代码>自 ”;我们不明白问题在哪里。

如果您的基类需要从子类调用实例方法,那么它需要对子类实例的引用。也就是说,你有:

@interface Concrete:Base

然后,Base可能会实现一个类方法,如:

+ baseWithConcreteQuantity:(int)aQuant
{
    return [[self alloc] initWithConcreteQuantity:aQuant];
}

它的用法如下:

[Concrete baseWithConcreteQuantity:10];

也就是说,Object-C中的类方法与其他语言中的静态方法不同,它像实例方法一样被继承

现在,对于实例方法,您总是从该方法调用super的特定方法的实现。使用super调用基类的另一个方法几乎是不可能的,这肯定是其他错误的迹象。

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

即。

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

- (void)doSomething { ; }

// where a subclass might
- (void)doSomething { ... ; [super doSomething]; }
 类似资料:
  • 我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出:

  • 在此设置下: 如果我将我的点切改为以下内容: 它的唯一工作方式是在中重写

  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用

  • 我最近一直在翻阅几本书,以便自学Java幸运的是,主要是由于运气,我遇到的困难很少。这种情况刚刚改变。 我在继承和整个超类子类设置下阅读了下面的一节 --创建新的超类对象时,与所有对象一样,会为其指定一个引用(本例中为superReference) --如果创建了一个新的子类对象(定义子类扩展了超类),然后superReference引用被设置为引用该对象而不是原始对象,我的理解是,由于引用是针对