如何避免在objective-c中被子类覆盖的超类方法

Man*_*ath 10 iphone cocoa cocoa-touch objective-c

像在java中一样:

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

如何在objective-c中实现此行为?

hoo*_*oop 11

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

  • Objective-c基本上是开放的 - 我可以在运行时做任何事情,添加类,删除属性,交换方法实现,甚至动态编译新代码.我可以对任何类,任何属性,甚至私有iVars和任何方法执行此操作.现在,当然,您可以使用所有这些技术为您的代码添加安全措施(它肯定不会更有效).但是,任何想要绕过你的技术的人都可以使用相同的措施 - 所以不是花时间. (4认同)

Wil*_*and 7

正如已经多次说过的那样,你做不到.

但是,如果你正在制作一个图书馆(这是我唯一可以看到它相关的情况),你可以采取一些步骤.嗯,一个,真的.

在类的文档中写下"此类不用于子类化".(参考NSIndexSet)或" 不要覆盖这种方法. "(参考+[NSApplication sharedApplication].

作为一种解释,值得注意的是(几乎)Obj-C中发生的所有事情,以及它与C的区别,都是在运行时发生的,而运行时则是"正确的".任何一段代码都可以在闲暇时检查,改变或颠覆运行时,使Obj-C成为一种非常强大的语言; 特别是关于其"元语言"结构.