luc*_*hra 63
Final是类修饰符,可以防止它被继承或被覆盖.来自苹果文档
您可以通过将方法,属性或下标标记为final来阻止它被覆盖.通过在方法,属性或下标的介绍者关键字(例如final var,final func,final class func和final subscript)之前编写final修饰符来完成此操作.
任何覆盖子类中的最终方法,属性或下标的尝试都会报告为编译时错误.您添加到扩展中的类的方法,属性或下标也可以在扩展的定义中标记为final.
您可以通过在类定义(最终类)中的class关键字之前编写final修饰符来将整个类标记为final.任何将最终类子类化的尝试都会报告为编译时错误.
tot*_*ter 58
标记为的类final不能被覆盖.
为什么要关心课程是否可以被覆盖?
有两件事需要考虑:
final防止类被子类化 - 任务完成.您还可以使用final标记非最终类的方法,属性甚至下标.这将产生相同的效果,但对于课程的特定部分.final也告诉Swift编译器应该直接调用该方法(静态调度),而不是从方法表(动态调度)中查找函数.这减少了函数调用开销,并为您提供额外的性能.您可以在Swift Developer Blog上阅读更多相关内容.Vla*_*bir 20
当您知道不需要覆盖声明时,请使用final.final关键字是对类,方法或属性的限制,表示无法覆盖声明.这允许编译器安全地忽略动态调度间接.
阅读更多:
https://developer.apple.com/swift/blog/?id=27
希望我能将其他答案归结为对我有帮助的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
Run Code Online (Sandbox Code Playgroud)
在您的项目/模块中:
class SubOpen: Open {} // OK
class SubNormal: Normal {} // OK
class SubInternal: Internal {} // OK
class SubFinal: Final {} // Error: Can't subclass
Run Code Online (Sandbox Code Playgroud)
在其他一些项目/模块中:
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
Run Code Online (Sandbox Code Playgroud)
其他答案已经对最终关键词有足够的了解.我想通过一些例子来解释.
请考虑以下没有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)
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,它允许覆盖它的超类的变量.而带有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)
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将给出最终A类B类的错误继承
| 归档时间: |
|
| 查看次数: |
24494 次 |
| 最近记录: |