swift 9: 面向?qū)ο? 繼承

所有面向?qū)ο笳Z言都具有三大特征:封裝、繼承、多態(tài)

1:簡介:

當有多個類具有相同的屬性和行為時,將共同的部分提取出來封裝成新的類,然后讓多個類繼承這個新類。(使代碼維護起來更加簡單)

(1)繼承:與現(xiàn)實生活中的繼承原理相同 。 例如:財產(chǎn)繼承、基因繼承等

(2)繼承講的是父與子的關(guān)系,子繼承于父。 
編程語言中繼承指的是類與類之間的繼承

(3)關(guān)系:父類(parentClass) 、超類(superClass) 、基類 
子類(childClass) 、子類(subClass)、 派生類

(4)重寫:子類繼承父類的方法,屬性,下標. 如果子類繼承父類的方法,屬性,下標,并不滿足子類的需求,子類可以將繼承過來的內(nèi)容進行重寫。
重寫就是方法名相同,內(nèi)容不同

(5)派生:子類也有自己的屬性、方法、下標,子類較父類多出的部分,稱為派生

2繼承的格式

class name: super class {
    code
}

3單繼承

(1)swift語言中沒有統(tǒng)一的父類,如果定義類時沒有指定該類的父類,那么這個類就可以充當父類

(2)swift語言中的繼承指的是單繼承,一個子類只有一個直接父類??梢越柚鷧f(xié)議實現(xiàn)多繼承(和OC一樣),在后續(xù)的文章協(xié)議中會具體介紹

(3)一個類的屬性和方法在內(nèi)存中分為兩部分: 一部分是自身的屬性和方法,一部分是從父類繼承過來的屬性和方法。

(4)self關(guān)鍵字在實例方法中相當于對象,在類方法中相當于類名

程序?qū)嵗缦?

class Person {
    var name: String = ""
    static var age : Int = 0 // static也可以修飾屬性
    
    func eat() -> Void {
        print("\(name)正在吃東西")
    }
    func sleep() -> Void {
        print("\(Person.age)正在睡覺")
        // static修飾的屬性為類型屬性, 必須通過類名調(diào)用.非static修飾的屬性為存儲屬性 , 通過對象調(diào)用
    }
    static func hitDouDou () -> Void {
        print("\(age)正的在打豆豆")
        // <結(jié)論>self關(guān)鍵字在實例方法中相當于對象,在類方法中相當于類名
    }
}

class Man: Person {
    var height : Double = 0.0
    
    func writeCoder() -> Void {
        name = "ZZ"
        Man.age = 11
        print("\(name)今年:\(Man.age)歲了,身高:\(height),")
    }
}
var man = Man.init()
man.height = 1.90
man.writeCoder()
man.eat()
man.sleep()
Man.hitDouDou()

4:重寫父類的方法

(1)子類重寫父類的方法,子類重寫的方法就會將父類的同名方法進行覆蓋,所以子類對象調(diào)用的同名方法是子類重寫的方法

(2)子類的方法名、參數(shù)列表,如果和父類中的方法完全相同,編譯器默認就是重寫方法,需要在方法名前加關(guān)鍵字override。

程序?qū)嵗缦拢?/p>

class Car {
    var speed : Double = 90.0
    var wheel : Int = 4
    
    func run() -> Void {
        print("速度為\(speed)的大眾速騰后懸掛斷了")
    }
    class func stop () {
        print("因為斷軸不會跑了")
    }
}

var car = Car.init()
car.run()
Car.stop()

class Bike: Car {
    override func run() {
         super.run() // super關(guān)鍵字!只是!用來調(diào)用父類的方法或者屬性,只是個關(guān)鍵字,沒有其它意義
        print("跑丟了\(wheel)輪子")
    }
    // 父類中使用static修飾的方法/屬性 子類只能繼承 不能重寫
    // 父類中使用class修飾的方法/屬性 子類可以重寫 但是很少使用class關(guān)鍵字定義方法
    override class func stop () {
        super.stop()
    }
}
var bike = Bike.init()
bike.speed = 20.0
bike.wheel = 2
bike.run()
Bike.stop()

5重寫父類的屬性

(1)swift語言中是允許子類重寫父類的屬性的,可以為重寫的屬性指定get和set方法,實現(xiàn)對重寫屬性進行讀寫操作,也可以添加屬性觀察者willSet didSet

(2)子類重寫父類的屬性 ,如果父類的屬性是只讀屬性(get), 子類重寫的時候可以添加set方法 , 但是 如果父類的屬性是讀寫屬性(get,set) 子類重寫的時候如果只有只讀或者只寫部分,是會崩潰的。

程序示例如下:

class Cat {
    var color : String = ""
    var description: String {
//        get {
            return "??"
//        }
    }
}
class Panda: Cat {
    override var color: String {
        get{
            return super.color
        }
        set{
            super.color = newValue
        }
    }
    override var description: String {
        get {
            return "國寶"
        }
        set {
            print("重寫父類的計算屬性的set方法")
        }
    }
}
var panda = Panda.init()
panda.color = "黑白色"

print(panda.description)

6重寫父類下標

和父類的下標寫法幾乎一樣,見代碼如下

class Fruit {
    var color : String = ""
    
    subscript (index: Int) -> String {
        set {
            color = newValue
        }
        get {
            return color
        }
    }
}
var f = Fruit.init()
f[0] = "Green"
print(f[0])

class Apple: Fruit {
    override subscript (index: Int) -> String {
        get {
            return color + "蘋果"
        }
        set {
            color = newValue
        }
    }
}
var apple = Apple.init()
apple[0] = "Rad"
print(apple[0])

7父類禁止子類重寫的方法

(1)關(guān)鍵字 final 可以修飾 類, 方法, 屬性, 下標

(2) final 修飾的 【類】是不能被繼承的 , final 修飾的方法、屬性、下標是不能被重寫的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容