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

Bre*_*ett 24 iphone objective-c

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

我有另一个customclass(ClassA)的子类(ClassB):

@interface ClassB : ClassA {
}
Run Code Online (Sandbox Code Playgroud)

在内部ClassA,有一种方法叫做:

-(void)methodName;
Run Code Online (Sandbox Code Playgroud)

这是正确的.

但是,我需要这种方法来启动ClassB.

我试过实现(in ClassB):

-(void)methodName {
  [super methodName];
}
Run Code Online (Sandbox Code Playgroud)

但它仍然不会开火ClassB.

如何覆盖methodName以便它将被触发ClassB

Man*_*Way 33

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

- (void)methodName
{
    // custom code

    // call through to parent class implementation, if you want
    [super methodName];
}
Run Code Online (Sandbox Code Playgroud)

  • 他没有说他实际上把他添加的代码放在哪里.而且,这是正确的做法. (5认同)
  • 显然你可以覆盖methodName并在classB中执行它而不删除对super的调用.您甚至不必覆盖它,只要您从ClassB创建一个对象,它就会在ClassB中执行.但是,他说"我已经尝试过(在ClassB中):".那么他所做的确实是要做的事情.由于他所做的是正确的,我认为问题是他不知道为什么在重写方法时ClassA中的内容仍然在执行.而且,这是因为对super的调用.[但也许我完全误解了这个问题;)] (2认同)

Rem*_*hem 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
}
Run Code Online (Sandbox Code Playgroud)

在Apple的Objective-C编程语言文档中,随意阅读自己和超级消息.