[解決済み] 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を作成することが最善でしょう。
関連
-
[解決済み] Error: this class is not key value coding-compliant for key tableView.' [重複] を修正する方法。
-
[解決済み] swiftの"? "の意味は何ですか?[重複している]。
-
[解決済み] 純粋な」Swift で弱いプロトコル参照を作るには (@objc なしで) どうしたらいいですか?
-
[解決済み] String型のenumを列挙する方法は?
-
[解決済み] Swift: print() vs println() vs NSLog()
-
[解決済み] なぜ「Implicitly Unwrapped Optionals」を作るのか、それは値があることを知っていることを意味しているからです。
-
[解決済み] テキストファイルからの文字列の読み込みと書き込み
-
[解決済み】Swiftでボタンに丸みを帯びたボーダーを付けるにはどうすればいいですか?
-
[解決済み】swift 4でenumをDecodableにするにはどうすればいいですか?
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Thread 1: signal SIGABRTエラーを解決するには?[クローズド]
-
[解決済み] 型のインスタンスでは静的メンバを使用できません。
-
[解決済み] swift 3 エラー。引数ラベル '(_:)' は利用可能なオーバーロードに一致しません。
-
[解決済み] Swift Optionals - 条件の変数バインディングはイニシャライザを必要とする
-
[解決済み] Swift 3、Swift 4、それ以降で dispatch_sync, dispatch_async, dispatch_after などはどうすればいいですか?
-
[解決済み] Swiftでストアドプロパティをオーバーライドする
-
[解決済み】==と===の違いについて
-
[解決済み】SwiftでFloatをIntに変換する。
-
[解決済み】コンパイラーエラー。Objective-C のセレクタを持つメソッドは、同じ Objective-C セレクタを持つ以前の宣言と競合しています。
-
[解決済み] Swift言語でのエラーハンドリング