본문 바로가기
독서에서 한걸음

Refused Bequest

by oncerun 2022. 12. 28.
반응형

 

상속 포기라는 뜻으로 서브클래스가 슈퍼클래스에서 제공하는 메서드나 데이터를 잘 활용하지 않는다는 것은 해당 상속 구조에 문제가 있다는 것이다.

 

기존의 서브클래스 또는 새로운 서브클래스를 만들고 슈퍼클래스에서 메서드와 필드를 내려주어 슈퍼클래스에는 공동으로 사용하는 기능만 남길 수 있다.

 

서브클래스가 슈퍼클래스의 기능을 재사용하고 싶지만 인터페이스를 따르고 싶지 않은 경우에는 슈퍼클래스 또는 서브클래스를 위임으로 교체하여 사용한다.

 

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

댓글