在類的定義中使用final關鍵字聲明類、屬性、方法和下標。final聲明的類不能被繼承,final聲明的屬性、方法和下標不能被重寫。
下面看一個示例:
final class Person {//聲明為final,說明它是不能被繼承的 var name: String final var age: Int //定義的age屬性 final func description() -> String { //定義description實例方法 return "\(name) 年齡是: \(age)" } final class func printClass() ->() { //定義printClass靜態方法 print( "Person 打印...") } init (name: String, age: Int){ self.name = name self.age = age } } class Student: Person { //編譯錯誤 var school: String convenience init() { self.init(name: "Tony", age: 18,school: "清華大學") } init (name: String, age: Int,school: String) { self.school = school super.init(name: name, age: age) } override func description() -> String{ //編譯錯誤 //試圖重寫description實例方法 print("父類打印 \(super.description())") return "\(name) 年齡是: \(age), 所在學校: \(school)。" } override class func printClass() ->(){ //編譯錯誤 //試圖重寫printClass靜態方法 print( "Student 打印...") } override var age: Int { //編譯錯誤//試圖重寫age屬性 get { return super.age } set { super.age = newValue < 8 ? 8: newValue } } }
定義Student類,並聲明為Person子類時,會報如下編譯錯誤:
Inheritance from a finalclass 'Person'
定義的age屬性也是final,那麼在試圖重寫age屬性時,會報如下編譯錯誤:
Var overrides a 'final'var
定義description實例方法,它被聲明為final,那麼在試圖重寫description實例方法時,會報如下編譯錯誤:
Instance method overridesa 'final' instance method
定義printClass靜態方法,它被聲明為final,那麼在試圖重寫printClass靜態方法時,會報如下編譯錯誤:
Class method overrides a'final' class method
使用final可以控制我們的類被有限地繼承,特別是在開發一些商業軟件時,適當地添加final限制是非常有必要的。