Swift 入門 | クラスの基本 | クラスの継承

クラスは関連する関数や変数をまとめられるだけでなく、プログラムを再利用しやすくする。クラスがあれば、必要な場所で同じ機能を利用できる。

クラスの再利用を大きく拡張する機能が継承である。継承を使うと、既存クラスのすべての機能を受け継いだ新しいクラスを定義できる。便利なクラスがすでにある場合は、それを継承し、独自の機能を追加して新しいクラスを作成できる。

継承を使ったクラスは、次のように定義する。

class クラス名: スーパークラス名 {
    ... クラスの内容 ...
}

継承元のクラスをスーパークラスと呼ぶ。継承して作成したクラスをサブクラスと呼ぶ。サブクラスは、スーパークラスの機能をすべて利用できる。

次の例では継承を使用する。

import Cocoa

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

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

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

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

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

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

このコードでは、Helo クラスを継承した Hello クラスを作成して使用している。Hello のインスタンスでは、Hello で追加した name2 プロパティと say2 メソッドだけでなく、Helo から継承した name プロパティと say メソッドも利用できる。

say2 メソッドでは、スーパークラスで定義した name プロパティを使用している。スーパークラスの機能は、サブクラス自身の機能として扱える。

スーパークラスのイニシャライザーを呼び出す

別の継承例を見てみよう。

class Friend {
    var name:String

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

class BestFriend : Friend {
    var age:Int

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

}

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

このコードでは、Friend を継承して BestFriend を定義している。BestFriendname プロパティを宣言していないが、Friend から継承したプロパティを利用できる。

BestFriend のイニシャライザーには super.init(name:name) がある。super はスーパークラスを表すキーワードである。この文は Friend のイニシャライザーを呼び出す。ほかのスーパークラスのメソッドも super.メソッド名 の形式で呼び出せる。