解析Swift說話面絕對象編程中的繼續特征。本站提示廣大學習愛好者:(解析Swift說話面絕對象編程中的繼續特征)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Swift說話面絕對象編程中的繼續特征正文
取年夜於形狀的才能被界說為繼續。普通一個類可以從另外一個類繼續屬性和辦法。類可以進一步劃分到子類和超類。
子類:當一個類從另外一個類繼續屬性,辦法和功效被稱為子類
超類:類包括屬性,辦法和功效被其它類繼續稱為超類
Swift 中類包括父類和挪用拜訪辦法,屬性,功效和重寫辦法。別的,屬性不雅察者也用於添加屬性和修正所存儲的或盤算的特征的辦法。
基類
一個類假如不從其它類繼續辦法,屬性或功效,那末它被稱為“基類”。
classStudDetails{var stname:String!var mark1:Int!var mark2:Int!var mark3:Int!
init(stname:String, mark1:Int, mark2:Int, mark3:Int){self.stname = stname
self.mark1 = mark1
self.mark2 = mark2
self.mark3 = mark3
}}let stname ="swift"let mark1 =98let mark2 =89let mark3 =76
println(stname)
println(mark1)
println(mark2)
println(mark3)
當我們應用 playground 運轉下面的法式,獲得以下成果。
swift 98 89 76
這裡 StudDetails 類被界說為基類,它用於包括先生名字和三個科目的記為:mark1, mark2 和 mark3. 'let'症結字在 playground 中初始化並應用 “println” 函數打印顯示基本類的值。
子類
在現有的基類上界說一個新的類就叫作“子類”。子類繼續了其基類的屬性,辦法和功效。要界說一個子類應用 “ : ” 在基類稱號前。
classStudDetails{var mark1:Int;var mark2:Int;
init(stm1:Int, results stm2:Int){
mark1 = stm1;
mark2 = stm2;}
func print(){
println("Mark1:\(mark1), Mark2:\(mark2)")}}class display :StudDetails{
init(){super.init(stm1:93, results:89)}}let marksobtained = display()
marksobtained.print()
當我們應用 playground 運轉下面的法式,獲得以下成果。
Mark1:93, Mark2:89
“StudDetails” 類界說為先生標志聲明的超類和子類的 'display' 從它的超類繼續以打的標志。子類界說先生標志和挪用打印辦法來顯示先生的標記。
籠罩/重寫
拜訪超類的實例,類型辦法,例如,類型屬性和下標子類供給籠罩的概念。 'override' 症結字用來籠罩超類中聲明的辦法。
拜訪超等類的辦法,屬性和下標
“super”症結字作為前綴用來拜訪超類中聲明的辦法,屬性和下標。
辦法和屬性籠罩 辦法籠罩
繼續實例和類型的辦法可以經由過程 'override' 症結字籠罩在子類中界說的辦法。在這裡,在子類中重寫打印來拜訪超類打印type屬性。
class cricket {
func print(){
println("Welcome to Swift Super Class")}}class tennis: cricket {override func print(){
println("Welcome to Swift Sub Class")}}let cricinstance = cricket()
cricinstance.print()let tennisinstance = tennis()
tennisinstance.print()
當我們應用 playground 運轉下面的法式,獲得以下成果。
Welcome to Swift Super Class Welcome to Swift Sub Class
屬性重寫
可以籠罩繼續的實例或類屬性來供給自界說的getter和setter 屬性,或添加屬性不雅察者,當基層屬性值更改時以使重寫屬性到不雅察者。
重寫屬性getter和setter
Swift 許可用戶供給自界說 getter和setter 籠罩繼續的屬性,不管是存儲照樣盤算屬性。子類不曉得繼續的屬性稱號和類型。是以,相當主要的是,用戶須要在子類中指定,稱號和在超類中指定重寫屬性的類型。
這可以經由過程兩種方法來完成:
當 setter 被界說為重寫屬性,用戶必需也要界說 getter。
當我們不願望修正繼續屬性的getter,我們可以經由過程簡略的語法“super.someProperty”來給超類繼續值。
classCircle{var radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius \(rect.area)")
當我們應用 playground 運轉下面的法式,獲得以下成果。
Radius of rectangle for 25.0 is now overridden as 3
重寫屬性不雅察者
當一個新的屬性須要為繼續的屬性被添加,在 Swift 中推出 “屬性重寫” 的概念。告訴用戶當繼續屬性值被更改。但重寫不實用於繼續的常量存儲屬性和繼續只讀盤算屬性。
classCircle{var radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius \(rect.area)")classSquare:Rectangle{overridevar radius:Double{
didSet {print=Int(radius/5.0)+1}}}let sq =Square()
sq.radius =100.0
println("Radius \(sq.area)")
當我們應用 playground 運轉下面的法式,獲得以下成果。
Radius of rectangle for 25.0 is now overridden as 3 Radius of rectangle for 100.0 is now overridden as 21
終究屬性以避免重寫
當用戶不須要讓他人拜訪超類的辦法,屬性或下標,Swift 引入“final”屬性,以避免籠罩。 當 “final” 屬性被聲明後,將不許可超類的辦法,屬性和下標被籠罩。在超類弗成以有 'final' 。當 “final” 屬性被聲明後,用戶限制子類創立。
finalclassCircle{finalvar radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius \(rect.area)")classSquare:Rectangle{overridevar radius:Double{
didSet {print=Int(radius/5.0)+1}}}let sq =Square()
sq.radius =100.0
println("Radius \(sq.area)")
當我們應用 playground 運轉下面的法式,獲得以下成果。
<stdin>:14:18: error: var overrides a 'final' var
override var area: String {
^
<stdin>:7:9: note: overridden declaration is here
var area: String {
^
<stdin>:12:11: error: inheritance from a final class 'Circle'
class Rectangle: Circle {
^
<stdin>:25:14: error: var overrides a 'final' var
override var radius: Double {
^
<stdin>:6:14: note: overridden declaration is here
final var radius = 12.5
當超類聲明為 “final”和數據類型也被宣明為'final',法式將不許可再創立子類,不然它會激發毛病。