-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[17주차] 12. 상속 다루기 (~12.11) (END) #16
Comments
12.9 계층 합치기클래스와 부모가 너무 비슷해질 때 하나로 합치기 12.10 서브클래스를 위임으로 바꾸기위임 : 다른 클래스를 멤버로 포함 상속의 단점은 한 번만 쓸 수 있는 카드. 클래스들의 관계를 아주 긴밀하게 결합. 위임은 두 문제를 해결해 준다. 다양한 클래스에 서로 다른 이유로 위임할 수 있다. 생성자 ⇒ 팩터리 함수로 바꿔서 생성자 호출 부분을 캡슐화 (수정할 게 많기 때문) 위임을 저장할 필드를 슈퍼클래스에 추가한다. → 서브클래스 생성 코드를 수정해 위임 인스턴스를 생성 → 서브 클래스의 메서드를 위임 클래스로 이동 _bePremium(extras) {
this._premiumDelegate = new PremiumBookingDelegate(this, extras);
} 12.11 슈퍼클래스를 위임으로 바꾸기제대로 된 상속이라면 서브클래스가 슈퍼클래스의 모든 기능을 사용함을 물론, 서브클래스의 인스턴스를 슈퍼클래스의 인스턴스로도 취급할 수 있어야 한다. 사용되는 모든 곳에서 서브클래스의 인스턴스를 대신 사용해도 이상없이 동작해야 한다. 슈퍼클래스 객체를 참조하는 필드를 서브 클래스에 만든다. → 슈퍼클래스 동작 각각에 대응하는 전달 함수를 서브클래스에 만든다. → 슈퍼클래스의 동작 모두가 전달 함수로 오버라이드되었다면 상속을 끊는다. 위임 많이 쓰나요?? 위임 객체가 있으면 이거 없으면 저거 하는 코드가 많아지는데 더 많아지면 이상적인 구조인가 슈퍼클래스의 모든 기능을 사용하는 게 아니라면 위임을 해서 일부 기능만 사용한다. |
12.9 계층 합치기코드 보기// 12.9 계층 합치기
// 리팩토링을 하다보면 어떤 클래스와 부모가 비슷해져서 클래스 계층 구조를 합치는 경우도 있다고 한다. 12.10 서브클래스를 위임으로 바꾸기코드 보기// 12.10 서브클래스를 위임으로 바꾸기
// 상속의 문제를 위임으로 해결
// 상속보다는 컴포지션을 사용하라!
// 저자는 상속으로 일단 개발하고 후에 문제가 생기면 위임으로 갈아탄다고 한다. (태세전환 오졌고)
open class Booking(
val show: String,
val date: String,
val extras: String = "",
) {
private val isPeakDay: Boolean = true
var premiumBookingDelegate: PremiumBookingDelegate? = null
open fun hasTalkback(): Boolean {
return premiumBookingDelegate?.hasTalkback() ?: this.isPeakDay
}
fun bePremium(extras: String) {
this.premiumBookingDelegate = PremiumBookingDelegate(this, extras)
}
fun hasDinner(): Boolean? {
return premiumBookingDelegate?.hasTalkback() ?: null
}
}
class PremiumBookingDelegate(
val host: Booking,
val extras: String
) {
fun hasTalkback(): Boolean {
return true
}
}
fun createBooking(show: String, date: String): Booking {
return Booking(show, date)
}
fun createPremiumBooking(show: String, date: String, extras: String): Booking {
val premiumBooking = Booking(show, date, extras)
premiumBooking.bePremium(extras)
return premiumBooking
}
fun main() {
val aBooking = Booking("123", "2022-01-25")
val aPremiumBooking = Booking("12434", "2022-01-25", "vip")
}
12.11 슈퍼클래스를 위임으로 바꾸기코드 보기// 12.11 슈퍼클래스를 위임으로 바꾸기
open class CatalogItem(
val id: Long,
val title: String,
val tags: String,
)
class Scroll(
val id: Long,
val title: String,
val tags: String,
val dateLastCleaned: String,
val catalogItem: CatalogItem = CatalogItem(id, title, tags)
) |
12.9 계층 합치기
12.10 서브클래스를 위임으로 바꾸기
12.11 슈퍼 클래스를 위임으로 바꾸기
|
진도
방식
The text was updated successfully, but these errors were encountered: