2017-09-05 317 views
2

final class和Class有什么区别?final Class和Class有什么区别?

final class A { 

} 

class B {  

} 
+0

'A'不能扩展https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html –

+1

@埃克托您的意思是继承;扩展在Swift中是完全不同的东西。 – Hamish

+0

是的,没错。抱歉 –

回答

7

最终是类改性剂,其防止它被遗传或被重写。从苹果公司的文件

您可以将其标记为最终预防方法,属性,或者被覆盖 标。通过该方法,属性或标的介绍人关键字之前写final修饰符 做到这一点(例如 作为最终无功,最终FUNC,最后一类FUNC,和最后的下标)。

任何试图重写 子类中的最终方法,属性或下标都会报告为编译时错误。要添加到一类的扩展方法,属性,或 标也可以被标记 作为扩展的定义范围内的决赛。

您可以通过在其类定义(final类)class关键字前写的最后修改 标志着整个类为final。任何 尝试子类的最终类报告为编译时错误。

3

最终意味着没有人能够继承这个类。

11

当你知道一个声明不需要重写 时使用final。最后关键字上的类,方法,或 属性指示该声明不能被覆盖的限制。 这允许编译器安全地避免动态分配间接。

了解更多:

https://developer.apple.com/swift/blog/?id=27

0

除了final声明不也需要被重写具有比没有用final更好的性能,因为在运行时final禁用动态传递,其中保存运行时开销。标有final

3

类不能被重写。


为什么要关心类是否可以被覆盖?

,需要考虑两件事情:

  1. 作为一个API设计/开发人员,你可能在你的框架类,可以被滥用或子类时,误用。 final可以防止课程被分类 - 任务完成。您还可以使用final来标记非最终类的方法,属性,甚至下标。这会产生同样的影响,但对于班级的特定部分。
  2. 标记类为final也告诉Swift编译器该方法应直接调用(静态调度),而不是从方法表(动态调度)查找函数。这可以减少函数调用开销并为您提供额外的性能。你可以在Swift开发者博客上read more on this
相关问题