1. ホーム
  2. inheritance

[解決済み] Swiftでストアドプロパティをオーバーライドする

2022-02-25 18:08:48

質問

コンパイラは、ストアドプロパティを別のストアド値で上書きすることを許可しないことに気づきました(これは奇妙なことです)。

class Jedi {
    var lightSaberColor = "Blue"
}


class Sith: Jedi {
    override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}

しかし、私はこれを計算されたプロパティで行うことを許可されています。

class Jedi {
    let lightSaberColor = "Blue"
}


class Sith: Jedi {
    override var lightSaberColor : String{return "Red"}

}

なぜ他の値を与えてはいけないのですか?

なぜストアドプロパティでのオーバーライドは忌み嫌われ、計算されたプロパティでのオーバーライドは合法なのでしょうか?彼らは何を考えているのでしょうか?

どうすればいい?

<ブロッククオート

なぜ、別の値を与えるだけではいけないのですか?

継承されたプロパティに別の値を与えることは、間違いなく許可されています。そのプロパティをコンストラクタで初期化し、その初期値を受け取り、派生クラスから別の値を渡せば、それが可能になります。

class Jedi {
    // I made lightSaberColor read-only; you can make it writable if you prefer.
    let lightSaberColor : String
    init(_ lsc : String = "Blue") {
        lightSaberColor = lsc;
    }
}

class Sith : Jedi {
    init() {
        super.init("Red")
    }
}

let j1 = Jedi()
let j2 = Sith()

println(j1.lightSaberColor)
println(j2.lightSaberColor)

プロパティをオーバーライドすることは、そのプロパティに新しい値を与えることと同じではありません。それはむしろ、クラスに別のプロパティを与えるようなものです。実際、計算されたプロパティをオーバーライドすると、そのようなことが起こります。ベースクラスでプロパティを計算するコードは 置き換え 派生クラスでそのプロパティのオーバーライドを計算するコードによって。

[実際のストアドプロパティをオーバーライドすることは可能でしょうか? lightSaberColor 他の動作をさせることができますか?

オブザーバを除けば、ストアドプロパティは振る舞いを持たないので、オーバーライドするものは何もないのです。このプロパティに別の値を与えることは、上記のメカニズムによって可能です。これは、質問の例が達成しようとしていることを、異なる構文で正確に行うものです。