Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
継承 / override / final / super
Swiftのクラスは他のクラスを継承できます。親クラスのメソッドやプロパティをオーバーライドするには『override』キーワードが必要です。
構文
// 基底クラス
class 親クラス {
func メソッド() { }
var プロパティ: 型 { get }
}
// 継承
class 子クラス: 親クラス {
// オーバーライド
override func メソッド() {
super.メソッド() // 親の実装を呼ぶ
// 追加処理
}
// これ以上オーバーライドできないメソッド
final func finalMethod() { }
}
構文一覧
| 構文 | 概要 |
|---|---|
| class 子: 親 { } | 親クラスを継承する子クラスを定義します。 |
| override func / var | 親クラスのメソッド・プロパティをオーバーライドします。 |
| super.メソッド() | 親クラスの実装を呼び出します。 |
| final class | 継承できないクラスを定義します。 |
| final func / var | オーバーライドできないメソッド・プロパティを定義します。 |
サンプルコード
// 基底クラス
class Animal {
var name: String
init(name: String) {
self.name = name
}
func speak() -> String {
return "..."
}
func describe() -> String {
return "\(name) は \(speak()) と言います"
}
}
// 継承と override
class Dog: Animal {
override func speak() -> String {
return "ワン"
}
// 追加メソッド
func fetch() {
print("\(name) がボールを取ってきました")
}
}
class Cat: Animal {
var indoor: Bool
init(name: String, indoor: Bool) {
self.indoor = indoor
super.init(name: name) // 必ず super.init を呼ぶ
}
override func speak() -> String {
return "ニャン"
}
override func describe() -> String {
let base = super.describe()
return "\(base)(\(indoor ? "室内" : "屋外")猫)"
}
}
let dog = Dog(name: "ポチ")
let cat = Cat(name: "タマ", indoor: true)
print(dog.describe())
print(cat.describe())
dog.fetch()
// ポリモーフィズム
let animals: [Animal] = [dog, cat, Animal(name: "謎の生き物")]
for animal in animals {
print(animal.describe())
}
概要
Swiftの継承は単一継承のみサポートされています(複数の親クラスを持つことはできません)。子クラスで親のイニシャライザをオーバーライドする場合、『super.init()』を必ず呼び出す必要があります。
『final』を付けたクラス・メソッド・プロパティはオーバーライドや継承ができなくなります。パフォーマンスの向上にもつながります。override をつけずに親クラスと同名のメソッドを定義するとコンパイルエラーになります。意図的なオーバーライドには必ず override キーワードを付けてください。
プロパティの種類については格納型プロパティ / 計算型プロパティ / lazyを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。