0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

継承とは?

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

使い方

class サブクラス : スーパークラス {
    サブクラスで追加変更するプロパティ
    サブクラスで追加変更するメソッド
}
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の勉強を1年以上前にやってたのですが、その頃は今以上に継承とかインターフェースについて理解してませんでした。
CやJavaをやっている人だと、インターフェースやクラスの継承を使ったことがあるので、オブジェクト指向を理解しているから、キャッチアップが早いのでしょうね。
私は、Dartを使って設計の勉強をしてからやっと理解できました💦

SwiftやKotlinだと、継承するときに : を使うので、extendesに慣れていると違和感を感じます💦
しかし、コードを短く書けるので可読性は高いのかなと思いました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?