Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. 継承 / override / final / super

継承 / 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を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。