【问题标题】:Objective-C convention for overridden methods覆盖方法的 Objective-C 约定
【发布时间】:2012-05-10 14:52:13
【问题描述】:

在 Java 中,当您覆盖方法时,建议(几乎是强制)添加 @Override 注释。在 Objective-C 世界中是否有标记(在 cmets 中或通过其他机制)覆盖方法的约定?

【问题讨论】:

标签: objective-c oop overriding


【解决方案1】:

没有。 Objective-C 中的所有方法都是通过 Objective-C 的消息传递发送的,因此所有方法都可以被覆盖。这是语言的一部分。

也没有标记这个的约定。它是语言的一部分,如果您要发表评论,否则当您以后无意或有意这样做时,它只会令人困惑。

【讨论】:

  • 我知道,Java 的情况也是如此——(几乎)所有函数都是虚拟的,但是我仍然看到警告您正在覆盖父方法的要点。它肯定会使诸如不调用[super loadView]; 之类的错误更容易被发现
  • 您需要查看文档并阅读您的方法。有些方法,调用super很重要。在某些方法中,不要调用 super 至关重要。过去,我会说你想要的对于 IDE 是不可能的,但很明显苹果现在几乎可以做任何事情,因为他们控制了编译器、框架和语言,所以可能值得通过他们的 bug 提出建议记者。
【解决方案2】:

我不确定 Xcode 是否这样做,但 Jetbrains 的 AppCode IDE 会自动在边距中使用蓝色的小覆盖徽章注释被覆盖的方法,如下所示:

。 .除此之外(也显示了),我还喜欢创建一些实时模板(在 Xcode 中也称为 code-sn-ps),以使用 #pragma 标记来注释被覆盖的方法。我发现按以下顺序定义标准结构会有所帮助:

  • 类方法
  • 初始化和销毁​​
  • 公共方法/协议方法
  • 重写的方法
  • 私有方法

通过使用实时模板/代码片段,我只需键入“覆盖 [tab]”,IDE 就会为我创建 #pragma 标记。

。 .也许你甚至可以使用 OCLint 来检查这个结构是否被遵守。

【讨论】:

    【解决方案3】:

    不,不是。

    这似乎并不重要,可能是因为动态调度。

    【讨论】:

    • ObjC 使用动态调度这一事实与实用程序无关。它可能与实现编译时检查的困难有关,但如果它存在的话,它肯定会在 ObjC 中有用。编译器检查覆盖的主要用途是注意到基类方法何时被重构/重命名。您的子类可能认为它仍在覆盖某些东西,但某些东西已被重命名,现在没有人调用您的方法。
    • @Baxissimo 事实是没有这样的注释,而且在 Objective-C 中,这样的注释是有问题的,因为 all 对象响应 all i> 选择器。只是有时响应是抛出异常。认为向 Objective-C 对象发送消息与在 Swift 对象上调用函数是一样的,这是错误的。
    • 我在浪费时间试图弄清楚为什么测试开始失败后发现了这个问题。测试中的伪造品试图覆盖基类中的方法,但基类方法被重命名。覆盖注释会抓住这一点。它不会是灵丹妙药,因为正如您所说,基类可以以无法静态确定的方式动态处理它想要的任何方法。然而,大多数典型的 ObjC 代码确实使用在标头中声明的静态方法签名,并且您可以有一个注释,表示“必须是静态声明方法的覆盖”。
    • @Baxissimo 您为什么要浪费时间试图弄清楚测试失败的原因?测试中抛出的异常是显而易见的。 Apple 从未在 Objective-C 中添加 override 注释,而是创建了一种全新的语言,这是有原因的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多