【问题标题】:How to avoid superclass methods getting overridden by sub class in objective - c如何避免超类方法被目标中的子类覆盖 - c
【发布时间】:2010-05-19 09:32:01
【问题描述】:

就像在java中一样:

final 类不能被子类化。这样做是出于出于安全性和效率的原因。因此,许多 Java 标准库类都是最终类,例如 java.lang.System 和 java.lang.String。 final 类中的所有方法都是隐式 final 的。

如何在 Objective-c 中实现这种行为?

【问题讨论】:

  • 安全是什么意思? java.lang.String 成为 final 如何提高安全性?
  • @jeremyP: google "using final in java" 你会得到答案。
  • 试过了,没有比这更明智的了。 you 是什么意思?当我在编程上下文中听到“安全”这个词时,我通常会想到诸如防止未经授权访问数据和密码以及加密之类的事情。使 String 类最终化在这方面没有帮助。如果您的意思是“健壮性”,那么公平地说,Objective-C 具有不可变对象,但由实现者来确保它们保持不变。
  • 也许他的意思是允许第三方修改 System 或 String 等核心类的行为会让他们“进入系统”并执行恶意操作。至少在未越狱的 iOS 上,我不认为应用程序开发人员以外的第三方的代码可以在运行时加载/执行,但可能还有其他我没有考虑过的场景......

标签: iphone objective-c cocoa cocoa-touch


【解决方案1】:

你不能。效率没有涉及。如果您对安全性感到困扰,请不要使用objective-c。总会有办法绕过您采取的任何措施。

【讨论】:

  • 你确定我们在 obj-c 中没有这样的设施吗?你的意思是 obj-c 不提供这种安全性?
  • Objective-c 基本上是开放的——我可以在运行时做任何事情,添加类,删除属性,交换方法实现,甚至动态编译新代码。我可以对任何类、任何属性、甚至私有 iVar 和任何方法执行此操作。现在,当然,您可以使用所有这些技术为您的代码添加安全措施(它肯定不会更有效)。但是,任何想要绕过您的技术的人都可以使用相同的措施 - 所以时间不值得花。
【解决方案2】:

正如多次所说,你不能。

但是,如果您正在创建一个库(无论如何,这是我认为这是相关的唯一情况),您可以采取一些步骤。嗯,一个,真的。

在类的文档中写下“该类不用于子类化”。 (参考NSIndexSet)或“不要覆盖此方法。”(参考+[NSApplication sharedApplication]

作为一种解释,值得注意的是(几乎)发生在 Obj-C 中的所有事情,以及将它与 C 分开的所有事情,都发生在运行时,运行时就是,可以说“就在那里”。任何一段代码都可以在闲暇时检查、变异或扭曲运行时,使 Obj-C 成为一种非常强大的语言;尤其是关于它的“元语言”结构。

【讨论】:

    【解决方案3】:

    objective-c 中没有最终的等价物。有相同的模式可能是不错的选择,它们会给你更好的分离,但既没有性能也没有安全性:

    1. 如果您只想允许使用delegate 模式覆盖某些方法可能是更好的选择。
    2. 如果您根本不想要子类化,那么您可以使用abstract factory 模式。声明公共接口+工厂方法,隐藏具体实现类。

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2016-01-27
      • 2020-02-15
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多