原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請注明:關(guān)東升的博客
在類的定義中使用final關(guān)鍵字聲明類、屬性、方法和下標。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靜態(tài)方法
??????? 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: "清華大學(xué)")
??? }???
??? 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), 所在學(xué)校: \(school)。"
??? }???
??? override class func printClass() ->() {????? //編譯錯誤?//試圖重寫printClass靜態(tài)方法
??????? print( "Student 打印...")
??? }???
??? override var age: Int {??????????????????????? //編譯錯誤?//試圖重寫age屬性
??? get {
??????? return super.age
??? }
??? set {
??????? super.age = newValue < 8 ? 8: newValue
??? }
??? }
}
定義Student類,并聲明為Person子類時,會報如下編譯錯誤:
Inheritance from a final class 'Person'
定義的age屬性也是final,那么在試圖重寫age屬性時,會報如下編譯錯誤:
Var overrides a 'final' var
定義description實例方法,它被聲明為final,那么在試圖重寫description實例方法時,會報如下編譯錯誤:
Instance method overrides a 'final' instance method
定義printClass靜態(tài)方法,它被聲明為final,那么在試圖重寫printClass靜態(tài)方法時,會報如下編譯錯誤:
Class method overrides a 'final' class method
使用final可以控制我們的類被有限地繼承,特別是在開發(fā)一些商業(yè)軟件時,適當?shù)靥砑觙inal限制是非常有必要的。