Swift では、なんとなく、メソッドしかオーバーライドできないと思いがちですが、プロパティもオーバーライドできます。改めて説明してみます。
Sponsor Link
プロパティのオーバーライド
メソッドのオーバーライドと同様に、オーバーライドできます。
つまり、子クラス側で、親クラスと同名のプロパティを定義することでオーバーライドできます。
オーバーライド例
親クラスが持つ someProp プロパティを、子クラスでオーバーライドしてみます。
親クラス
someProp プロパティを定義しています。
親クラス
1 2 3 4 5 |
class BasePropClass { var someProp:String = "test" } |
子クラス
同名のプロパティを定義することでオーバーライドします。
子クラス
1 2 3 4 5 6 7 8 9 10 11 12 |
class OverridePropClass: BasePropClass { override var someProp: String { get { return String.init(super.someProp.reversed()) } set(newValue) { super.someProp = newValue } } } |
上記のように、親クラスのプロパティには、”super.<プロパティ名>” でアクセスすることもできます。
注意点
- プロパティのオーバーライドは、 final キーワードを付与することで禁止することができます
- プロパティのタイプは同じでなければいけません
- プロパティの read-only, read-write を変えようとすると制約がある
親クラスで、read-only プロパティだったものについて、子クラスで、getter と setter を用意することで、read-write にすることはできます。
親クラスで、read-write プロパティだったものについて、子クラスで、read-only としてプロパティをオーバーライドすることはできません。 - 子クラスで、setter を定義したときは、getter も定義しないといけません。
まとめ
プロパティのオーバーライド
- override を付与して、同名のプロパティを子クラスで定義する
- タイプは、同じにしないといけない
- final 指定すると、オーバーライドを禁止できる
- 親クラスで read-write プロパティを子クラスで read-only プロパティとしてオーバーライドはできない
- その他、制約あり
説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。
Sponsor Link