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()