반응형
상속 포기라는 뜻으로 서브클래스가 슈퍼클래스에서 제공하는 메서드나 데이터를 잘 활용하지 않는다는 것은 해당 상속 구조에 문제가 있다는 것이다.
기존의 서브클래스 또는 새로운 서브클래스를 만들고 슈퍼클래스에서 메서드와 필드를 내려주어 슈퍼클래스에는 공동으로 사용하는 기능만 남길 수 있다.
서브클래스가 슈퍼클래스의 기능을 재사용하고 싶지만 인터페이스를 따르고 싶지 않은 경우에는 슈퍼클래스 또는 서브클래스를 위임으로 교체하여 사용한다.
public class Employee {
protected Quota quota;
protected Quota getQuota() {
return new Quota();
}
}
public class Salesman extends Employee {
}
public class Engineer extends Employee {
}
Employee의 유산인 Quota 객체와 해당 메소드를 공통으로 사용할 이유가 없다. 예를 들어 Engineer는 해당 유산이 필요 없다면 메서드와 필드를 Push Down 한다.
public class Salesman extends Employee {
protected Quota quota;
protected Quota getQuota() {
return new Quota();
}
}
실제로 간단하지만 놓치기 쉬운 리팩토링으로 상속구조를 유심히 봐서 실제 사용되는 필드와 메서드가 특정 서브클래스에서만 사용되지 않는지 확인하는 작업이 필요하다.
이 경우 Salesman이 상속을 포기하고 싶다면 다음과 같이 리팩토링 해도 된다.
public class Salesman {
private Employee employee;
protected Quota quota;
public Salesman(Employee employee, Quota quota) {
this.employee = employee;
this.quota = quota;
}
protected Quota getQuota() {
employee.another();
return new Quota();
}
}
반응형
'독서에서 한걸음' 카테고리의 다른 글
도메인 주도 개발 Value Type (0) | 2023.01.01 |
---|---|
Comments (0) | 2022.12.28 |
Alternative Classes with Different Interfaces (0) | 2022.12.27 |
Large Class (0) | 2022.12.26 |
Insider Trading (0) | 2022.12.26 |
댓글