[解決済み] 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
他の動作をさせることができますか?
オブザーバを除けば、ストアドプロパティは振る舞いを持たないので、オーバーライドするものは何もないのです。このプロパティに別の値を与えることは、上記のメカニズムによって可能です。これは、質問の例が達成しようとしていることを、異なる構文で正確に行うものです。
関連
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] 変数を使用してオブジェクトのプロパティに動的にアクセスする
-
[解決済み】Kotlinでデータクラスを拡張する
-
[解決済み】Mavenプロジェクトのバージョン継承 - 親バージョンを指定する必要があるか?
-
[解決済み] Swift言語における抽象クラス
-
[解決済み] Swift で異なる型のスーパークラスのプロパティをオーバーライドする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン