継承 / override / final / super
| 対応: | Swift 1.0(2014) |
|---|
Swiftのクラスは他のクラスを継承できます。親クラスのメソッドやプロパティをオーバーライドするには『override』キーワードが必要です。
構文
// 基底クラス
class 親クラス {
func メソッド() { }
var プロパティ: 型 { get }
}
// 継承
class 子クラス: 親クラス {
// オーバーライド
override func メソッド() {
super.メソッド() // 親の実装を呼ぶ
// 追加処理
}
// これ以上オーバーライドできないメソッド
final func finalMethod() { }
}
構文一覧
| 構文 | 概要 |
|---|---|
| class 子: 親 { } | 親クラスを継承する子クラスを定義します。 |
| override func / var | 親クラスのメソッド・プロパティをオーバーライドします。 |
| super.メソッド() | 親クラスの実装を呼び出します。 |
| final class | 継承できないクラスを定義します。 |
| final func / var | オーバーライドできないメソッド・プロパティを定義します。 |
サンプルコード
sample_inheritance_override.swift
// 基底クラス
class Inspector {
var name: String
init(name: String) {
self.name = name
}
func duty() -> String {
return "職務を遂行します"
}
func describe() -> String {
return "\(name): \(duty())"
}
}
// 継承と override
class DivisionOneInspector: Inspector {
override func duty() -> String {
return "公安局刑事課一係で捜査します"
}
// 追加メソッド
func analyze() {
print("\(name) がドミネーターで犯罪係数を分析しました")
}
}
class ChiefInspector: Inspector {
var division: String
init(name: String, division: String) {
self.division = division
super.init(name: name) // 必ず super.init を呼ぶ
}
override func duty() -> String {
return "係長として指揮を執ります"
}
override func describe() -> String {
let base = super.describe()
return "\(base)(\(division)所属)"
}
}
let kogami = DivisionOneInspector(name: "狡噛慎也")
let ginoza = ChiefInspector(name: "宜野座伸元", division: "一係")
print(kogami.describe())
print(ginoza.describe())
kogami.analyze()
// ポリモーフィズム
let inspectors: [Inspector] = [kogami, ginoza, DivisionOneInspector(name: "常守朱")]
for inspector in inspectors {
print(inspector.describe())
}
swift inheritance_override.swift 狡噛慎也: 公安局刑事課一係で捜査します 宜野座伸元: 係長として指揮を執ります(一係所属) 狡噛慎也 がドミネーターで犯罪係数を分析しました 狡噛慎也: 公安局刑事課一係で捜査します 宜野座伸元: 係長として指揮を執ります(一係所属) 常守朱: 公安局刑事課一係で捜査します
概要
Swiftの継承は単一継承のみサポートされています(複数の親クラスを持つことはできません)。子クラスで親のイニシャライザをオーバーライドする場合、『super.init()』を必ず呼び出す必要があります。
『final』を付けたクラス・メソッド・プロパティはオーバーライドや継承ができなくなります。パフォーマンスの向上にもつながります。override をつけずに親クラスと同名のメソッドを定義するとコンパイルエラーになります。意図的なオーバーライドには必ず override キーワードを付けてください。
プロパティの種類については格納型プロパティ / 計算型プロパティ / lazyを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。