재정의란?
클래스의 상속에서 상위클래스의 속성/메서드의 기능을 변형하여 사용하는것
프로퍼티의 재정의
- 저장속성의 경우 재정의 불가능
- 단 저장속성 -> 계산속성 식의 메서드 형태로 부수적 추가는 가능
- 물론 계산속성 -> 계산속성 식의 재정의도 가능하다
class Person {
var id = 0
var name = "Jimin"
var phoneNumber = "010xxxxxxxx"
func doSomething() {
print("doSomething")
}
}
class Student: Person {
var studentId = 0
// override var name = "Minji" (상위 저장속성의 값을 바꾸는 것은 불가능)
// 저장속성을 계산속성으로 재정의하는것은 가능
override var name: String {
get {
return super.name // 상위 클래스의 프로퍼티에 직접 접근할때는 super 키워드를 붙여줘야한다(self 아님)
} set {
super.name = newValue
}
}
// 저장속성에 속성감시자를 추가하는 재정의도 가능
override var id: Int {
didSet {
print("\(id)으로 값바뀜")
}
}
func doSomething2() {
print("\(name)님의 studentId는 \(studentId)입니다")
}
}
var student1 = Student()
student1.name // Jimin
student1.name = "Minji"
student1.name // Minji
student1.id = 10 // 콘솔: 10으로 값바뀜
주의점
- 속성의 유지, 확장은 가능하나 축소는 불가능하다
- 이는 저장속성, 계산속성 모두 공통점이다
class Person {
var id = 0
var name = "Jimin" // 저장속성은 기본적으로 읽기, 쓰기 지원
var phoneNumber = "010xxxxxxxx"
func doSomething() {
print("doSomething")
}
}
class Student: Person {
var studentId = 0
// 읽기, 쓰기가 가능했던 속성을
// 읽기전용으로 재정의하는것은 불가능하다
// 읽기 -> 읽기, 읽기 -> 읽기,쓰기는 쌉가능
// override var name: String {
// get {
// return super.name
// }
// }
}