Swift 入門 | クラスの基本 | メソッドのオーバーライド

継承を使うと、既存のクラスに新しい機能を追加できる。しかし、継承した機能の動作を変更したい場合もある。

スーパークラスのメソッドを再定義する機能をオーバーライドと呼ぶ。次のようにメソッドを定義する。

override func メソッド名() {...}

先頭に override を付けると、スーパークラスの実装を新しく定義したメソッドで置き換えられる。その後、そのメソッドを呼び出すと新しい処理が実行される。

メソッドをオーバーライドする場合、メソッド名、引数、返り値はスーパークラスのメソッドと完全に一致する必要がある。

次の例ではオーバーライドを使用する。

import Cocoa

class Helo {
    var name:String = "Taro";

    func say(){
        print("Hello, " + name + "!");
    }
}

class Hello:Helo {
    var name2:String = "YAMADA";

    override func say(){
        print("Hi," + name + "-" + name2 + "!");
    }
}

var obj:Hello = Hello();
obj.say();

obj.name = "Hanako";
obj.name2 = "TANAKA";
obj.say();

この例では、以前のコードを変更して say をオーバーライドしている。Hello のインスタンスで say を呼び出すと、Helo の実装ではなく Hello の実装が実行される。

オーバーライドの詳細

継承を使うと、サブクラスはスーパークラスのプロパティとメソッドをそのまま利用できる。継承した機能をサブクラスで変更する場合は、オーバーライドを使う。

スーパークラスに A というメソッドがあるとする。通常、サブクラスから A を呼び出すと、継承したスーパークラスのメソッドが実行される。サブクラスで A をオーバーライドすると、サブクラスの実装が実行される。

オーバーライドするメソッドの先頭には override 修飾子を付ける。メソッド名、引数、返り値はすべて一致する必要がある。どれか 1 つでも異なる場合は、オーバーライドではなく別のメソッドとして扱われる。

次の例では printData をオーバーライドする。

class Friend {
    var name:String

    init(name:String) {
        self.name = name
    }

    func printData() {
        print("\(self.name)")
    }
}

class BestFriend : Friend {
    var age:Int

    init(name:String, age:Int) {
        self.age = age
        super.init(name:name)
    }

    override func printData() {
        print("\(self.name) (\(self.age))")
    }
}

var you = BestFriend(name: "Taro", age: 30)
you.printData()