2020/1/17 Swift 継承(inheritance)

クラスはメソッド・プロパティ、そしてその他の特徴を他のクラスから継承できます。継承先のクラスはサブクラス、継承元(継承される)クラスはスーパークラスと呼ばれます。継承はSwiftにおいてクラスとその他の型を違うものとする基本的な挙動です。

Swiftのクラスは、スーパークラスのメソッド・プロパティ・サブスクリプトにアクセスしたり呼び出したりすることができ、スーパークラスのメンバの挙動を修正変更してオーバーライドすることもできます。Swiftはオーバーライドの定義が、スーパークラスの定義と矛盾しないかをチェックして、オーバーライドが正しく行われることをサポートします。

クラスは継承したプロパティの値が変更されたことを知らせるために、プロパティオブザーバーを追加することができます。オリジナルの定義がストアドプロパティかコンピューテドプロパティかは関係なく、全てのプロパティに対してプロパティオブザーバを追加できます。

ベースクラスを定義する

スーパークラスを持たないクラスは、ベースクラスとして知られています。

NOTE

Swiftのクラスはユニバーサルベースクラスを継承しません。スーパークラスを継承していることを明示しない場合そのクラスはベースクラスになります。

下のサンプルはベースクラスVehicleを定義しています。このベースクラスはデフォルト値0.0でストアドプロパティcurrentSpeedを定義しています。currentSpeedの型はDouble型と推定されます。currentSpeedプロパティの値は、読み取り専用String型プロパティのdescriptionで使用され、descriptionはその車の説明文を生成します。

ベースクラスVehicleは、makeNoiseメソッドも定義します。Vehicleインスタンスを生成してmakeNoiseメソッドを呼び出しても、makeNoiseメソッドは特に何もしません。後にVehicleクラスのサブクラスを作るときに、オーバーライドするためのメソッドとして用意しています。

sample1-1

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // do nothing - an arbitrary vehicle doesn't