Objective-C - 子类中的重写方法

时间:2011-07-28 11:50:19

标签: iphone objective-c

我在计算小时时遇到了一些问题,无法准确地覆盖我的一个子类中的方法。

我有另一个自定义类(ClassA)的子类(ClassB):

@interface ClassB : ClassA {
}

并且在ClassA内,有一个名为:

的方法
-(void)methodName;

正确发射。

但是,我需要在ClassB中触发此方法。

我已尝试实施(在ClassB中):

-(void)methodName {
  [super methodName];
}

但它仍然不会在ClassB中触发。

如何覆盖methodName以便在ClassB中触发?

5 个答案:

答案 0 :(得分:32)

您只需在classB中的methodName中添加自定义代码:

- (void)methodName
{
    // custom code

    // call through to parent class implementation, if you want
    [super methodName];
}

答案 1 :(得分:20)

首先,确保您的init方法创建一个ClassB对象而不是ClassA(或其他)对象。

然后,如果你想创建一个完全不同的classB(void)methodName:方法而不是在classA中找到的方法,那么这就是要走的路:

超级是超类。通过调用[super methodName],您要求ClassA执行它自己的methodName。 如果要完全覆盖classA中的methodName,则不要调用super。

所以,基本上,在你的classB的methodName实现:

-(void)methodName {
  // Remove [super methodName]
  // Insert the code you want for methodName in ClassB
}

请随时阅读Apple的Objective-C编程语言文档中的Messages to self and super

答案 2 :(得分:0)

写作:

-(void)methodName {
  [super methodName];
}

告诉编译器:执行Class B的methodName时,调用其超类(Class A)的methodName。因此,如果您希望B类执行不同的操作,则必须编写导致不同行为的代码。像这样:

-(void)methodName {
  NSLog(@"Hello, world!");
}

现在通过调用B类的methodName“Hello,world!”将打印在控制台上。

答案 3 :(得分:0)

-(void)methodName {
  [super methodName];
}

想要调用methodName(在ClassB中),只需删除[super method]然后就可以激活它。 导致super回拨给ClassA

答案 4 :(得分:-1)

虽然这个问题太老了,但每个专家都有一些学习者, 以下内容摘自Apple文档。 “新方法必须具有相同的返回类型,并采用与您覆盖的方法相同的参数数量和类型。” 完整答案可以在Apple method overriding documentation中找到  希望这有助于某人。