【问题标题】:Objective-C - Overriding method in subclassObjective-C - 子类中的覆盖方法
【发布时间】:2011-07-28 11:50:18
【问题描述】:

我在确定准确覆盖我的一个子类中的方法的时间时遇到了一些麻烦。

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

@interface ClassB : ClassA {
}

ClassA内,有一个方法叫:

-(void)methodName;

正确触发。

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

我已经尝试实现(在ClassB):

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

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

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

【问题讨论】:

  • 如何初始化对象?

标签: iphone objective-c


【解决方案1】:

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

- (void)methodName
{
    // custom code

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

【讨论】:

  • 他没有说他实际上把他添加的代码放在哪里。而且,这是正确的做法。
  • 显然你可以覆盖 methodName 并在 classB 中执行它,而无需删除对 super 的调用。您甚至不必重写它,只要您从 ClassB 中创建一个对象,它就会在 ClassB 中执行。但是,他说“我已经尝试过(在 ClassB 中)实现:”。他所做的确实是要走的路。由于他所做的是正确的,我认为问题是他不知道为什么 ClassA 中的东西在方法被覆盖时仍在执行。而且,嗯,这是因为对超级的呼唤。 [但也许我完全误解了这个问题;)]
  • 他只说他希望它(methodName)在 ClassB 中触发,这就是你这样做的方式。
  • 是的,但你没有回答他的问题,因为他已经回答了。
  • -(void)methodName; 需要在 ClassA 的头文件中公开
【解决方案2】:

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

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

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

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

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

欢迎阅读 Apple 的 The Objective-C Programming Language 文档中的 Messages to self and super

【讨论】:

  • 这种子类的东西打破了里氏替换原则。
【解决方案3】:

通过写作:

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

你告诉编译器:在执行Class B的methodName时,调用它的超类(Class A)的methodName。因此,如果您希望 B 类做一些不同的事情,您必须编写导致不同行为的代码。像这样:

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

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

【讨论】:

    【解决方案4】:
    -(void)methodName {
      [super methodName];
    }
    

    想要调用 methodName(在 ClassB 中),只需删除 [super method] 即可触发它。 因为 super 是回调到 ClassA

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 堆栈溢出不应复制所有文档。由于 OP 没有做错,因此没有回答问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多