🪶

クラスの継承と上書き、プロトコル

に公開

継承とは?

クラスは他のクラスから継承することができます。これは、一つのクラスが他のクラスの特性を引き継ぐことを意味します。継承するクラスをサブクラス、継承されるクラスをスーパークラスと呼びます。サブクラスはスーパークラスの特性を引き継ぎつつ、新たな特性を追加したり、既存の特性を上書きしたりすることができます。

使い方

Swiftでクラスを継承するときは、:を使う。Javaとかなら、extendsですね。

class サブクラス : スーパークラス {
    サブクラスで追加・変更するプロパティ
    サブクラスで追加・変更するメソッド
}

[example]

class Vehicle {
    var speed: Int = 0
    func accelerate() {
        speed += 10
    }
}

class Car: Vehicle {
    var gear: Int = 1
    func changeGear(to newGear: Int) {
        gear = newGear
    }
}

let car = Car()
car.accelerate()
car.changeGear(to: 3)
print(car.speed)  // "10"が出力される
print(car.gear)   // "3"が出力される

継承したクラスを上書きする

override(上書き)を使用すると、継承したクラスのメソッドを上書きすることができます。車というクラスのメソッドを継承したトヨタというクラスが上書きして、メソッドの処理を書き換えることができます。

// 継承されるスーパークラス
class Car {
    // プロパティ
    let name : String = "車"
    
    func start() -> () {
        print("これは\(name)です。")
    }
}

// 継承するサブクラス
class Toyota : Car {
    let price : Int = 3000000
    
    // メソッドを上書きして処理を書き換える。
    override func start() {
        super.start()
        print("これは¥\(price)のToyota製の\(name)です")
    }
}
let toyota = Toyota()
toyota.start()
// log
// これは車です。
// これは¥3000000のToyota製の車です

プロトコルを使った継承

Swift のプロトコルは、型のインターフェースを定義するものです。具体的な処理内容は書かず、クラスや構造体が実装するプロパティとメソッドを定義します。

  • プロトコルのメリットは次のとおりです。
    • 実装を後から変更できる
    • 複数のプロトコルを適用できる
    • 柔軟性が高い
    • 抽象化できる
// 抽象クラスのように使える
protocol Car {
    func start()
    func stop()
}

// クラスで継承する場合
class Toyota : Car {
    
    func start() {
        print("ランクルのエンジンをかける!")
    }
    
    func stop() {
        print("ランクルのエンジンを停止する")
    }
}

// クラスをインスタンス化する
let toyota = Toyota()
toyota.start()
toyota.stop()

// 構造体で継承することもできる
struct Nissan : Car {
    
    func start() {
        print("エクストレイルのエンジンをかける!")
    }
    
    func stop() {
        print("エクストレイルのエンジンを停止する")
    }
}

// 構造体をインスタンス化する
let nissan = Nissan()
nissan.start()
nissan.stop()

まとめ

Swiftのクラスの継承とプロトコルについて解説しました。実際に使ってみると、もっと難しい構文で書くと思います。:とプロトコルとは何か最低限理解するのが今回の目的なので、何かアプリを作りながら、覚えていかないと、本に書いてあることだけでは、理解をするのは難しかったですね📚

Discussion