公開中のアプリ

[Swift入門#22]クラス(クラスの継承編)

今回はクラスの継承の方法について書きたいと思います。

クラスの継承とは?

クラスの継承とは、既存のクラスの機能を引継ぎつつ、それとは別のクラスを新しく作る事ができる仕組みです。

どんな時に使うの?

例えばクラスAを複製してクラスBを作って、クラスBにメソッドやプロパティを追加して用途に応じてクラスAを使ったりクラスBを使ったりしたい時に使います!
クラスAとほとんど同じ機能を持っているのにクラスBを一から作るのって面倒ですよね?
そう言う時にクラスを継承すると便利です!

ちなみに、もととなるクラスの事を「親クラス」「スーパークラス」と言い、複製して新しく作るクラスの事を「子クラス」「サブクラス」と呼びます。

クラスの継承の書き方

下記コードのStaffクラスを継承してStaff2と言うクラスを作ってみたいと思います。

class Staff {
    let name: String     //バイトの名前
    var salaryHour: Int  //時給
    var worked: Int      //働いた時間
    init(_ name: String, _ salaryHour: Int, _ worked: Int) {
        self.name = name
        self.salaryHour = salaryHour
        self.worked = worked
    }
    func output(_ date: String) {
        print("日付->\(date) 名前->\(name) 時給->\(salaryHour)円 働いた時間->\(worked)時間")
    }
}

継承するには下記コードのように
class [新しいクラス名]: [継承したいクラス名]
このように書けばOKです!

class Staff2: Staff {

}

これでStaffクラスのプロパティやメソッドをStaff2クラスでも参照できるようになりました。
試しにStaff2クラスでインスタンスを生成してStaffクラスのプロパティを取得しました。
結果を見てみると、ちゃんと継承できているのがわかると思います。

class Staff2: Staff {

}

let fucahn = Staff2("Fu-chan", 1100, 7)

print(fucahn.name)// 結果 Fu-chan
print(fucahn.salaryHour)// 結果 1100
print(fucahn.worked)// 結果 7

では次にStaff2クラス独自のプロパティを追加してみます。
今回は日給を計算する計算プロパティを追加しました。

class Staff2: Staff {
    var salaryDay: Int { //日給
        get {
            return Int(salaryHour * worked)
        }
    }
}

let fucahn = Staff2("Fu-chan", 1100, 7)

print(fucahn.salaryDay)// 結果 7700

Staff2だけの機能を追加したい場合は、このように追加するだけでOKです!

メソッドをoverrideしてみよう。

継承できるのはプロパティだけではなくメソッドも継承できます。
さらにメソッドは上書きする事も可能です。
これをoverrideと言います。

overrideの書き方。

ではStaffクラスのoutputメソッドを上書きしてみましょう。

class Staff2: Staff {
    var salaryDay: Int { //日給
        get {
            return Int(salaryHour * worked)
        }
    }
    override func output(_ date: String) {
        print("[Staff2] 日付->\(date) 名前->\(name) 時給->\(salaryHour)円 働いた時間->\(worked)時間 日給->\(salaryDay)")
    }
}

let fucahn = Staff2("Fu-chan", 1100, 7)
fucahn.output("4月20日")
// 結果 [Staff2] 日付->4月20日 名前->Fu-chan 時給->1100円 働いた時間->7時間 日給->7700

メソッドを上書きするにはoutputメソッドをコピペして、funcの前にoverrideと書いてあげて、上書きしたい内容を書けばOKです!
今回は日給を追加で出力できるようにしました。
ちなみにoverrideした事がわかりやすいようにprint()の先頭に[Staff2]と付けています。

overrideさせたくない場合。

overrideさせたくないメソッドの場合には、継承元のメソッドにfinalと付けてあげればOKです!

final func output(_ date: String) {
        print("日付->\(date) 名前->\(name) 時給->\(salaryHour)円 働いた時間->\(worked)時間")
    }

このように書けば、もしメソッドをoverrideしようとした時にエラーが出るようになるので間違ってoverrideしてしまうリスクがなくなります。

まとめ

似たようなクラスを作成する時はクラスを継承すると便利ですね。
メソッドを上書きする時はoverrideしてあげて、上書きさせたくない場合はfinalを使いましょう!
ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

アプリ