/**
지정 생성자 / 편의 생성자 상속과 재정의 규칙
*/
class Aclass {
var x = 0
// init() {} // 기본 생성자가 자동으로 생성
}
let a = Aclass()
print("a : \(a.x)")
// 상위의 지정생성자 🤙🏻
// init()
class Bclass: Aclass {
var y: Int
// 선택-1 : 지정생성자로 재정의
override init() { // 상위 클래스와 "이름이 동일한 생성자" 구현은 재정의만 가능함 (올바른 재정의) (지정생성자로 구현)
self.y = 0
super.init()
}
// 선택-2 : 서브 클래스에서 편의 생성자로 구현해보기
// 상위 클래스와 "이름이 동일한 생성자" 구현은 재정의만 가능함(올바른 재정의) (지정생성자 필요)
// override convenience init() {
// self.init(y: 0)
// }
// 선택-3 : 재정의 하지 않을 수도 있다.
// 선택-2,3 포함 (현재 단계의) 생성자 구현
init(y: Int) {
self.y = y
super.init()
}
}
let b = Bclass()
print("b 출력해보기 b.x : \(b.x), b.y: \(b.y)")
// 상위의 지정생성자 🤙🏻
//init()
//init(y: Int)
class Cclass: Bclass {
var z: Int
override init() { // 상위 클래스와 "이름이 동일한 생성자" 규현 (올바른 재정의)
self.z = 0
super.init() // 2단계 값설정(커스텀)없고, 상위구현에 기본 init() 만 있는 경우 생략가능 (암시적 요청)
}
override init(y: Int) {
self.z = 0
super.init(y: y)
}
init(z: Int) {
self.z = z
super.init() // 2단계 값설정(커스텀)없고, 상위구현에 기본 init() 만 있는 경우 생략가능 (암시적 요청)
}
}
/**
애플 공식 문서의 예제로 복습
*/
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\(numberOfWheels) wheel(s)"
}
// init() {}
}
// numberOfWheels 의 저장 속성에 기본값을 제공, 생성자 구현하지 않았으므로
// ==> 기본 생성자 init() 자동제공
let vehicle = Vehicle()
print("Vehicle : \(vehicle.description)")
// 상위의 지정생성자 🤙🏻
// init()
// 서브클래스 정의
class Bicycle: Vehicle {
override init() {
// numberOfWheels = 2 // 수퍼클래스 호출 후에 사용해야함 : 에러
super.init() // 수퍼클래스 호출 반드시 필요
numberOfWheels = 2 // 초기화 2단계 값설정
}
}
// 서브클래스 정의
class HoverBoard: Vehicle {
var color: String
// (읽기) 계산 속성 재정의
override var description: String {
return "\(super.description) in a beautiful \(color)"
}
// 편의 생성자로 구현
// override convenience init() {
// self.init(color: "빨간색")
// }
// 방법 1
// override init() {
// self.color = "빨간색"
// super.init()
// }
// 방법 2
init(color: String) {
self.color = color // (현재 클래스) 저장 속성 초기화
super.init() // ==> 여기서 암시적으로 호출됨
}
}
let hoverBoard = HoverBoard(color: "silver")
print("HoverBoard : \(hoverBoard.description)")