最终班级和班级之间有什么区别?
final class A {
}
class B {
}
答案 0 :(得分:52)
Final是类修饰符,可以防止它被继承或被覆盖。来自苹果文档
您可以阻止覆盖方法,属性或下标 将其标记为最终。通过编写最终修饰符来完成此操作 在方法,属性或下标的介绍者关键字之前(例如 作为final var,final func,final class func和final subscript)。
任何覆盖a中最终方法,属性或下标的尝试 子类报告为编译时错误。方法,属性或 您添加到扩展中的类的下标也可以标记 作为扩展定义中的最终内容。
您可以通过编写final修饰符将整个类标记为final 在类定义(最终类)中的class关键字之前。任何 尝试子类化最终类被报告为编译时错误。
答案 1 :(得分:42)
无法覆盖标有final
的类。
为什么要关心课程是否可以被覆盖?
有两件事需要考虑:
final
阻止类被子类化 - 完成任务。您还可以使用final
标记非最终类的方法,属性甚至下标。这将产生同样的效果,但对于课程的特定部分。final
也告诉 Swift编译器该方法应该直接调用(静态调度),而不是从方法表中查找函数(动态调度)。这减少了函数调用开销,并为您提供额外的性能。您可以在Swift Developer Blog上read more on this。答案 2 :(得分:19)
当您知道不需要声明时使用final 覆盖。 final关键字是对类,方法或类的限制 表示声明无法覆盖的属性。 这允许编译器安全地忽略动态调度间接。
了解更多:
答案 3 :(得分:10)
最后意味着没有人可以从这个类继承。
答案 4 :(得分:6)
除了final
声明不需要被覆盖也具有比不使用final
更好的性能,因为final
在运行时禁用动态分派,这节省了运行时开销。
答案 5 :(得分:6)
其他答案已经对final关键字有足够的理解。我想举例说明。
请考虑以下示例,其中不包含关键字final
。
class A {
public var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class B:A{
override init(name: String, breed: String) {
super.init(name: name, breed: breed)
}
}
在上面的代码中,它允许覆盖其超类的变量。而带有final关键字的Class不允许这样做。请参阅下面的示例。
final class A {
public var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class B:A{
**//ERROR:inheritance from a final class 'A' class B**
override init(name: String, breed: String) {
super.init(name: name, breed: breed)
}
}
以上代码将给出错误 A类最终B类的继承力
答案 6 :(得分:1)
希望我可以将其他答案归结为这个对我有帮助的SSCCE:
open class Open {} // Anyone can see, anything can subclass
public class Normal {} // Anyone can see, internal can subclass
internal class Internal {} // Internal can see, internal can subclass
public final class Final {} // Anyone can see, nothing can subclass
在您的项目/模块中:
class SubOpen: Open {} // OK
class SubNormal: Normal {} // OK
class SubInternal: Internal {} // OK
class SubFinal: Final {} // Error: Can't subclass
在其他一些项目/模块中:
class SubOpen: Open {} // OK
class SubNormal: Normal {} // Error: Can't subclass
class SubInternal: Internal {} // Error: `Internal` type not found
class SubFinal: Final {} // Error: Can't subclass