1. ホーム
  2. swift

[解決済み] Swift で異なる型のスーパークラスのプロパティをオーバーライドする

2022-05-17 21:25:27

質問

Swiftで、元のプロパティからサブクラス化された別のオブジェクトでスーパークラスのプロパティをオーバーライドする方法を説明できる人がいますか?

この簡単な例を見てみましょう。

class Chassis {}
class RacingChassis : Chassis {}

class Car {
    let chassis = Chassis()
}
class RaceCar: Car {
    override let chassis = RacingChassis() //Error here
}

これはエラーが出ます。

Cannot override with a stored property 'chassis'

代わりにchassisを'var'にすると、エラーが出ます。

Cannot override mutable property 'chassis' of type 'Chassis' with covariant type 'RacingChassis'

ガイドの "Overriding Properties" の項目で唯一見つけられたのは、ゲッターとセッターをオーバーライドしなければならないということです。これはプロパティの値を変更するためには有効かもしれませんが(それが 'var' であれば)、プロパティクラスを変更する場合はどうでしょうか。

どのように解決するのでしょうか?

Swiftでは、変数やプロパティのクラスタイプを変更することはできません。代わりに、新しいクラス型を処理するサブクラスで余分な変数を作成することができます。

class Chassis {}
class RacingChassis : Chassis {}

class Car {
    var chassis = Chassis()
}
class RaceCar: Car {
    var racingChassis = RacingChassis()
    override var chassis: Chassis {
        get {
            return racingChassis
        }
        set {
            if let newRacingChassis = newValue as? RacingChassis {
                racingChassis = newRacingChassis
            } else {
                println("incorrect chassis type for racecar")
            }
        }
    }
}

let 構文でプロパティを宣言し、サブクラスで var 構文で上書きすることはできないようです。この場合、サブクラスに合わせてスーパークラスでもプロパティを「var」で宣言する必要があります(上のスニペットに示すように)。スーパークラスのソースコードを変更できない場合は、シャーシを変更する必要があるたびに、現在のRaceCarを破棄し、新しいRaceCarを作成することが最善でしょう。