意味のある検証かどうかは置いておいて・・・
スーパークラスのイニシャライザはsuper.init()を明示しなくても自動的に呼ばれる。
ただし、この時の呼び出し順はサブクラス→スーパークラスの順番。
swift(オーバーライド時にsuper.init()なし)
class Parent {
let name:String = "Parent"
init(){
print("\(name)")
}
}
class Child : Parent {
let childname:String = "Child"
override init(){
print("\(childname)")
}
}
class Grandson : Child {
let grandsonname:String = "Grandson"
override init(){
print("\(grandsonname)")
}
}
let grandson = Grandson()
//結果: Grandson
// Child
// Parent
オーバーライドでinitの直後にsuper.init()を入れた場合、スーパークラス→サブクラスの順に呼び出される。当たり前か。
swift(オーバーライド時にsuper.init()あり)
class Parent {
let name:String = "Parent"
init(){
print("\(name)")
}
}
class Child : Parent {
let childname:String = "Child"
override init(){
super.init() //追加
print("\(childname)")
}
}
class Grandson : Child {
let grandsonname:String = "Grandson"
override init(){
super.init() //追加
print("\(grandsonname)")
}
}
let grandson = Grandson()
// 結果:Parent
// Child
// Grandson
試しにGrandsonクラスのsuper.init()の位置を入れ替えてみた。
super.init()がイニシャライザを明示的に呼び出している。当たり前か。
swift(super.init()位置を入れ替え)
(省略)
class Grandson : Child {
let grandsonname:String = "Grandson"
override init(){
print("\(grandsonname)")
super.init() //上から移動
}
}
let grandson = Grandson()
// 結果:Grandson
// Parent
// Child
super.init()を思い切って消してみた。
するとsuper.init()の位置を入れ替えた時と同じ結果になった。当たり前か。
もしかして、super.init()を省略しても、イニシャライザの最後に自動的に組み込まれているのかも?
swift(super.init()を削除)
(省略)
class Grandson : Child {
let grandsonname:String = "Grandson"
override init(){
print("\(grandsonname)")
}
}
let grandson = Grandson()
// 結果:Grandson
// Parent
// Child