objective-c - 防止在 Swift 中继承 Objective-C 类
问题描述
我正在向我的 Objective-C 类添加 Swift 内部注释。我试图阻止我的类被子类化:
__attribute__((objc_subclassing_restricted))
@interface CWTestFinalClass : NSObject
@end
这在 Objective-C 中按预期工作:
// Generates Error, as expected
@interface CWTestSubclass : CWTestFinalClass
@end
但是,我仍然可以在 Swift 中进行子类化
// Should fail, but works without error
class TestSubclass: CWTestFinalClass {
}
问题:如何防止 Objective-C 类在 Swift 中被子类化?
解决方案
Objective C 没有final
关键字或类似的东西。即使确实存在编译时属性或修饰符,也可以通过使用运行时 API 来动态创建任何 psuedofinal 类的子类来轻松地将其排除在外。
Swift 编译器强制 Swift 可以阻止尝试子类化一个final
类,但这不会阻止 Objective C 能够这样做(它不是通过 Swift 编译器编译的)。因此,objc_subclassing_restricted
添加了该属性,特别是使 clang 强制执行子类化final
Swift 类的非法性。
使 Objective C 类最终化并没有太大的好处,即使它是可能的。Objective C 是一种更加动态的语言,它似乎遵循 Python 的“我们都是成年人”的口头禅。
支持final
类的最大原因是通知编译器哪些类是去虚拟化的候选对象。但是Objective C 总是使用动态调度,并且无论如何都不会进行去虚拟化。