
今回はクラスの継承の方法について書きたいと思います。
クラスの継承とは、既存のクラスの機能を引継ぎつつ、それとは別のクラスを新しく作る事ができる仕組みです。
例えばクラス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と言います。
では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させたくないメソッドの場合には、継承元のメソッドにfinalと付けてあげればOKです!
final func output(_ date: String) {
print("日付->\(date) 名前->\(name) 時給->\(salaryHour)円 働いた時間->\(worked)時間")
}
このように書けば、もしメソッドをoverrideしようとした時にエラーが出るようになるので間違ってoverrideしてしまうリスクがなくなります。
似たようなクラスを作成する時はクラスを継承すると便利ですね。
メソッドを上書きする時はoverrideしてあげて、上書きさせたくない場合はfinalを使いましょう!
ありがとうございました。
コメントを残す