iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

今天要來講 繼承 這個類別,其實就跟他名字一樣他是 Class 裡面的一個特性,可以繼承其他 Class 的一個方法。

繼承

定義一個基本的 Class

不是繼承的 Class 通成為 基類(Base Class)

來看一下官方的例子

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // 不做任何事
    }
}

定義好了一個, Vehicle 的 Base Class 。
那我們用初始化語法來實例 Vehicle

let someVehicle = Vhicle()

現在已經實例化了一個 Vehicle 那可以來訪問他的 description 並輸出現階段的數值。

print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour

創建子類(Subclass)

生成 Subclass 就是在已有的 Class 上創建一個新的 Class 但他也會有原本 Class 的屬性但可以新增新的東西來完善它。

class SomeClass: SomeSuperclass {
   // SubClass 定義
}

下面的官方例子沿用前面的 Base Class 做的例子

class Bicycle: Vehicle {
    var hasBasket = false
}

就跟上面一樣,實例了 Bicycle 就可以修改裡面的東西,當然也包含他繼承的 Vehicle

let bicycle = Bicycle()
bicycle.hasBasket = true

bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

重寫(overriding)

一個 Subclass 可以給繼承來的 Class 裡面原有的方法提供自己的改寫。我們都叫做 overriding 。

重寫方法

依照前面的 Base Class 來寫下面的例子

class Train: Vehicle {
    ovrride func makeNoise() {
        print("Choo Choo")
    }
}

後面調用之後就會有更改後的效果

let train = Train()
train.makeNoise()
// Choo Choo

重寫屬性

可以重寫繼承來的實力屬性,也可以提供訂製的 getter 或 setter 來重寫任何繼承來的屬性。

看下面官方的例子,繼續沿用 Vehicle 這個例子

class Car: Vehicle {
    var gear = 1
    override var description: Sting {
        return super.description + "in gear \(gear)"
    }
}

重寫 description 要調用 super.description 先讓他拿到 Vehicle 原始的 description 屬性,之後再寫 Car Class 版本的 description
之後調用起來就會像下面

let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// Car: traveling at 25.0 miles per hour in gear 3

重寫屬性觀察器

你可以通過重寫屬性來為繼承來的屬性添加一個觀察器,如果屬性值被更改的時候就會得到通知。

我們來看官方的例子

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

依舊延續前面的例子,那調用出來後會像下面這樣。

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4

他裡面改變了 currentSpeed 所以他會做 gear = Int(currentSpeed / 10.0) + 1 這個方法。

防止重寫

如果要防止重寫被更改的話,只要在前面加上 final 就可以了。
final var , final func , final class 依此類推。

今天就到這裡,感謝各位。


上一篇
30天的 iOS 修仙道路 (23)
下一篇
30天的 iOS 修仙道路 (25)
系列文
30天的 iOS 修仙道路 站穩腳步基礎篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言