程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 解析Swift說話面絕對象編程中的繼續特征

解析Swift說話面絕對象編程中的繼續特征

編輯:更多關於編程

解析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',法式將不許可再創立子類,不然它會激發毛病。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved