Swift - 繼承


繼承我們可以理解為一個(gè)類獲取了另外一個(gè)類的方法和屬性球拦。
當(dāng)一個(gè)類繼承其他類時(shí),繼承類叫子類续搀,被繼承類叫超類塞琼。(或父類)
在Swift中,類可以調(diào)用和訪問(wèn)超類的方法禁舷,屬性和下表腳本彪杉,并且可以重寫它們毅往。
我們也可以為類中繼承來(lái)的屬性添加屬性觀察器。

基類

沒(méi)有繼承其他類的類派近,稱之為基類(Base Class)攀唯。
以下實(shí)例中我們定義了基類StudentDetails,描述了學(xué)生(studentName)及其各科成績(jī)的分?jǐn)?shù)(mark1渴丸、mark2侯嘀、mark3):

class StudentDetails {
    var studentName: String!
    var mark1: Int!
    var mark2: Int!
    var mark3: Int!
    init(studentName: String, mark1: Int, mark2: Int, mark3: Int) {
        self.studentName = studentName
        self.mark1 = mark1
        self.mark2 = mark2
        self.mark3 = mark3
    }
}
let studentName = "Swift"
let mark1 = 100
let mark2 = 95
let mark3 = 90
let sds = StudentDetails(studentName: studentName, mark1: mark1, mark2: mark2, mark3: mark3);

print(sds.StudentName)
print(sds.mark1)
print(sds.mark2)
print(sds.mark3)

以上程序執(zhí)行輸出結(jié)果為:

Swift
100
95
90

子類

子類指的是在一個(gè)已有類的基礎(chǔ)上創(chuàng)建一個(gè)新的類。
為了指明某個(gè)類的超類谱轨,將超類名寫在子類名的后面戒幔,用冒號(hào)(:)分隔,語(yǔ)法格式如下

class SomeClass: SomeSuperclass {
    //類的定義
}

實(shí)例

以下實(shí)例中我們定義了超類StudentDetails土童,然后使用子類Tom繼承它:

class StudentDetails {
     var mark1: Int
     var mark2: Int
     init(stm1: Int, results stm2: Int) {
         mark1 = stm1
         mark2 = stm2
     }
     func show() {
         print("Mark:\(self.mark1), Mark2:\(self.mark2)")
     }
}

class Tom : StudentDetails {
    init() {
        super.init(stm1: 93, results: 89)
    }
}
let tom = Tom()
tom.show()

以上程序執(zhí)行輸出結(jié)果為:

Mark: 93, Mark: 89

重寫(Overriding)

子類可以通過(guò)繼承來(lái)的實(shí)例方法溪食,類方法,實(shí)例屬性娜扇,或下標(biāo)腳本來(lái)實(shí)現(xiàn)自己的定制功能,我們把這種行為叫重寫(overriding)栅组。
我們可以使用override關(guān)鍵字來(lái)實(shí)現(xiàn)重寫雀瓢。

訪問(wèn)超類的方法、屬性及下標(biāo)腳本

你可以通過(guò)使用super前綴來(lái)訪問(wèn)超類方法玉掸,屬性或下標(biāo)腳本刃麸。


重寫方法和屬性

重寫方法

在我們的子類中我們可以使用override關(guān)鍵字來(lái)重寫超類的方法。
以下實(shí)例中我們重寫了show()方法:

class SuperClass {
    func show() {
        print("這是超類 SuperClass")
    }
}

class SubClass : SuperClass {
    override func show() {
        print("這是子類 SubClass")
    }
}

let superClass = SuperClass()
superClass.show()
let subClass = SubClass()
subClass.show()

以上程序執(zhí)行輸出結(jié)果為:

這是超類 SuperClass
這是子類 SubClass

重寫屬性

你可以提供定制的getter(或setter)來(lái)重寫任意繼承來(lái)的屬性司浪,無(wú)論繼承來(lái)的屬性是存儲(chǔ)型的還是計(jì)算型的屬性泊业。
子類并不知道繼承來(lái)的熟悉感是存儲(chǔ)型的還是計(jì)算型的,它只知道繼承來(lái)的屬性會(huì)有一個(gè)名字和類型啊易。所以你在重寫一個(gè)屬性時(shí)吁伺,必須將它的名字和類型都寫出來(lái)。
注意點(diǎn):
1租谈、如果你在重寫屬性中提供了setter篮奄,那么你也一定要提供getter。
2割去、如果你不想在重寫版本中的getter里修改繼承來(lái)的屬性值窟却,你可以直接通過(guò)super.someProperty來(lái)返回繼承來(lái)的值,其中someProperty是你要重寫的屬性的名字呻逆。
以下實(shí)例我們定義了超類Circle及子類Rectangle夸赫,在Rectangle類中我們重寫屬性area:

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半徑\(radius)"
    }
}

//繼承超類 Circle
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + ",但現(xiàn)在被重寫為\(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius\(rect.area)")

以上程序執(zhí)行輸出結(jié)果為:

Radius 矩形半徑 25.0咖城,但現(xiàn)在被重寫為 3

重寫屬性觀察器

你可以在屬性重寫中為一個(gè)繼承來(lái)的屬性添加屬性觀察器茬腿。這樣一來(lái)呼奢,當(dāng)繼承來(lái)的屬性值發(fā)生改變時(shí),你就會(huì)監(jiān)測(cè)到滓彰。
注意:你不可以為繼承來(lái)的常量存儲(chǔ)型屬性或繼承來(lái)的只讀計(jì)算型屬性添加屬性觀察器控妻。

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半徑為\(radius)"
    }
}

class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + ",但現(xiàn)在被重新寫為\(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半徑:\(rect.area)")

class Square: Rectangle {
    override var radius: Double {
        didSet {
            print = Int(radius/5.0) + 1
        }
    }
}

let sq = Square()
sq.radius = 100.0
print("半徑:\(sq.area)")

半徑:矩形半徑為 25.0揭绑,但現(xiàn)在被重寫為3弓候。
半徑:矩形半徑為100.0,但現(xiàn)在被重寫為21他匪。

防止重寫

我們可以使用final關(guān)鍵字防止它們被重寫菇存。
如果你重寫了final方法,屬性或下標(biāo)腳本邦蜜,在編譯時(shí)會(huì)報(bào)錯(cuò)依鸥。
你可以通過(guò)在關(guān)鍵字class前添加final特性(final class)來(lái)將整個(gè)類標(biāo)記final的,這樣的類是不可被避免繼承的悼沈,否則會(huì)報(bào)編譯錯(cuò)誤贱迟。

final class Circle {
    final var radius = 12.5
    var area: String {
        return(“矩形半徑為\(radius)”)
    }
}

class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + ",但我們被重寫為\(print)"
    }
}
let rect = Reatangle()
rect.radius = 25.0
rect.print = 3
print("半徑:\(rect.area)")

class Square: Rectangle {
    override var radius: Double {
        didSet {
            print = Int(radius / 5.0) + 1
        }
    }
}
let sq = Square()
sq.radius = 100.0
print("半徑:\(sq.area)")

由于以上實(shí)例使用了final關(guān)鍵字不允許重寫絮供,所以執(zhí)行會(huì)報(bào)錯(cuò):

error: var overrides a 'final' var
    override var area: String {
             ^
note: overridden declaration is here
    var area: String {
             ^
error: var overrides a 'final' var
    override var radius: Double {
             ^
note: overridden declaration is here
    final var radius = 12.5
             ^
error: inheritance from a final class 'Circle'
class Rectangle: Circle {
             ^

下一篇:“Swift - 構(gòu)造過(guò)程” http://www.reibang.com/p/8da749aa7f43

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衣吠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壤靶,更是在濱河造成了極大的恐慌缚俏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮乳,死亡現(xiàn)場(chǎng)離奇詭異忧换,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)向拆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門亚茬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人浓恳,你說(shuō)我怎么就攤上這事才写。” “怎么了奖蔓?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵赞草,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吆鹤,道長(zhǎng)厨疙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任疑务,我火速辦了婚禮沾凄,結(jié)果婚禮上梗醇,老公的妹妹穿的比我還像新娘。我一直安慰自己撒蟀,他們只是感情好叙谨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著保屯,像睡著了一般手负。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姑尺,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天竟终,我揣著相機(jī)與錄音,去河邊找鬼切蟋。 笑死统捶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柄粹。 我是一名探鬼主播喘鸟,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驻右!你這毒婦竟也來(lái)了迷守?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旺入,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凯力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茵瘾,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年咐鹤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拗秘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祈惶,死狀恐怖雕旨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捧请,我是刑警寧澤凡涩,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疹蛉,受9級(jí)特大地震影響活箕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜可款,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一育韩、第九天 我趴在偏房一處隱蔽的房頂上張望克蚂。 院中可真熱鬧,春花似錦筋讨、人聲如沸埃叭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赤屋。三九已至,卻和暖如春蛮粮,著一層夾襖步出監(jiān)牢的瞬間益缎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工然想, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莺奔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓变泄,卻偏偏與公主長(zhǎng)得像令哟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妨蛹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 繼承我們可以理解為一個(gè)類獲取了另外一個(gè)類的方法和屬性屏富。 當(dāng)一個(gè)類繼承其它類時(shí),繼承類叫子類蛙卤,被繼承類叫超類(或父類...
    零度_不結(jié)冰閱讀 303評(píng)論 0 0
  • ?一個(gè)類可以繼承另外一個(gè)類的方法狠半、屬性和其他特性。當(dāng)一個(gè)類繼承其他類時(shí)颤难,繼承類叫子類神年,被繼承類叫父類。?在swif...
    EndEvent閱讀 899評(píng)論 3 3
  • 123.繼承 一個(gè)類可以從另外一個(gè)類繼承方法,屬性和其他特征行嗤。當(dāng)一個(gè)類繼承另外一個(gè)類時(shí), 繼承類叫子類, 被繼承的...
    無(wú)灃閱讀 1,392評(píng)論 2 4
  • 下標(biāo)腳本 下標(biāo)腳本 可以定義在類已日、結(jié)構(gòu)體和枚舉這些目標(biāo)中,可以認(rèn)為是訪問(wèn)集合(collection)栅屏,列表(li...
    cht005288閱讀 448評(píng)論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,812評(píng)論 1 10