//Swift
//부모의 생성자는 자식에게 모두 상속되지 않는 것을 원칙으로 함
class Super {
var text: String
var extend: String
var only: String
init() {
self.text = ""
self.extend = ""
self.only = ""
}
init(text: String) {
self.text = text
self.extend = ""
self.only = ""
}
//required 생성자는 상속받은 자식에서 반드시 다시 구현해야 함
required init?(extend: String) {
print("init with super extend")
self.text = ""
self.extend = extend
self.only = ""
}
//convenience 생성자는 다른 생성자 호출을 도와줌
//convenience 생성자는 반드시 다른 생성자를 호출해야 함
convenience init?(only: String) {
print("init with only")
self.init(text: "")
self.only = only
}
deinit {
}
}
class Sub1: Super {
var content: String = ""
//재정의한 생성자가 하나도 없으면 부모의 모든 생성자 상속 받음
}
class Sub2: Super {
var content: String
override init(text: String) {
content = ""
super.init(text: text)
}
//부모의 required 생성자는 반드시 구현해야 함
required init?(extend: String) {
print("init with sub extend")
content = ""
super.init(extend: extend)
}
//부모의 모든 designated 생성자를 구현하면 부모의 모든 convenience 생성자를 상속 받음
//지금은 부모의 init()를 재정의하지 않았기 때문에 convenience 생성자를 상속 받지 않음
}
_ = Sub1(only: "only") _ = Sub2(extend: "extend") _ = Sub2(only: "only") //error, Sub2에서 부모의 init()를 재정의하면 호출가능
다시 정리하면…
부모의 생성자는 자식에게 모두 상속되지 않는 것을 원칙으로 함
하지만 부모의 생성자가 자식에게 상속되는 원칙)
1. 자식에서 재정의한 생성자가 하나도 없으면 부모의 모든 생성자를 자동으로 상속 받음
2. 자식에서 designated 생생자를 모두 재정의하면 모든 convenience 생성자는 상속 받음
designated : 일반적으로 구현한 생성자
required : 자식에서 반드시 구현해야 함, required 키워드가 override 의미를 포함
convenience : 다른 생성자의 호출을 쉽게 하기 위함, 내부에서 반드시 다른 생성자를 호출해야 함