はじめに
オーバーライドについて改めて学んだことを簡潔にまとめることとする。尚、継承の知識も必要である。
オーバーライド(override)の詳細
-
子クラスが親クラスを引き継いだ(継承)をした際、親クラスで定義されているメソッドやプロパティを「子クラス」で上書きすることができる。
-
親クラスの上書きは「継承している子クラス」で行われるため、その上書きした子クラスのクラス内でのみ、あるいは、インスタンス化したときに上書き内容が反映される。
-
親クラスで既に定義されているメソッドやプロパティで同じシグニチャ(同じ名前、同じ引数、同じ戻り値)のメソッドやプロパティを定義する場合は、「override」を指定する必要がある。
-
プロパティを上書きする場合は、親・子クラス共に「コンピューテッドプロパティ」でなければ上書きできない。
→こうすることで誤って親クラスのメソッドを上書きしてしまうミスを防ぐことができる。目印はoverride。 -
また、superをつけることによって、「子クラス」で親クラスに定義されてる関数などを呼び出すことができ、機能の追加などが可能
Swift
class User {
let id: Int
//コンピューテッドプロパティ(親クラスでコンピューテッドプロパティでなければ子クラスでもコンピューテッドプロパティで上書きできない)
var message: String {
return "Hello"
}
init(id: Int) {
self.id = id
}
func printProfile() {
print("id:\(id)")
print("message:\(message)")
}
}
class RegisterUser: User {
var name: String
//overrideを付けることにより親クラスのmessageプロパティを「この子クラスにおいて」上書き
override var message: String {
return "Hello, my name is \(name)"
}
init(id: Int, name: String) {
self.name = name
//superを付けることで継承している親クラスのinit()を子クラスで呼び出すことができる
super.init(id: id)
}
//overrideを付けることにより親クラスのprintProfileメソッドを「この子クラスにおいて」上書き
override func printProfile() {
//superを付けることで継承している親クラスのprintProfile()を子クラスで呼び出すことができる
super.printProfile()
print("name:\(name)")
}
}
class NonRegisterUser2: User {
//親クラスを継承するだけで何も定義しない
}
//親クラスのインスタンス化
let user = User(id: 1)
user.printProfile()
//id:1
//message:Hello
//子クラスのインスタンス化
let registeruUSer = RegisterUser(id: 2, name: "山田")
registeruUSer.printProfile()
//message:Hello, my name is 山田
//name:山田
//子クラスのインスタンス化
let nonRegisterUser = NonRegisterUser2(id: 3)
//registeruUSerを上書きしてインスタンス化したからといって、今後すべての親クラスを継承した子クラスに反映されるわけではない。あくまで、上書きされるのは、その上書きに関わる子クラス関連のみ。
nonRegisterUser.printProfile()
//id:3
//message:Hello
おわりに
継承についても次回記事にまとめます。(宿題)
参考記事
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者:片岡 巌
出版社:技術評論社
印刷/製本:日経印刷株式会社
開発環境
- Xcode-13.4.1
- iOS13以降