2017-12-08 23 views
0

인수가 하위 유형 또는 상위 유형인지 여부에 따라 메소드를 오버로드하는 것이 바람직하지 않은 디자인입니까?인수가 하위 유형 또는 상위 유형인지 여부에 따라 메소드를 오버로드하는 것이 바람직하지 않은 설계입니까?

나는 수퍼 클래스 A와 서브 클래스 B를 내포하려고하고 객체들은 서로 비교할 수있다.

compareTo는 클래스 A와 클래스 B에서 두 번 오버로드되며 코드가 다소 복잡해 보입니다. 추악한 디자인 느낌. 좀 더 우아한 접근 방법이 있는지 나는 잘 모르겠습니다.

class A implements Comparable<A> { 
    private Integer x; 

    public A(Integer i) { 
     x = i; 
    } 

    public Integer getX() { 
     return x; 
    } 

    public int compareTo(A other) { 
     return x.compareTo(other.getX()); 
    } 

    public int compareTo(B other) { 
     return x.compareTo(other.getX() + other.getY()); 
    } 
} 

class B extends A { 
    private Integer y; 

    public B(Integer a, Integer b) { 
     super(a); 
     y = b; 
    } 

    public Integer getY() { 
     return y; 
    } 

    @Override 
    public int compareTo(A other) { 
     return Integer.compare(this.getX() + y, other.getX()); 
    } 

    @Override 
    public int compareTo(B other) { 
     return Integer.compare(this.getX() + y, other.getX() + other.getY()); 
    } 
} 

답변

2

예 잘못된 디자인입니다. 이 같은 것이 더 좋을 것입니다.

class A implements Comparable<A> { 
    private Integer x; 

    public A(Integer i) { 
     x = i; 
    } 

    public Integer getX() { 
     return getX(); 
    } 

    protected Integer compareValue() { 
     return getX(); 
    } 

    @Override 
    public int compareTo(A other) { 
     return compareValue().compareTo(other.compareValue()); 
    } 
} 

class B extends A { 
    Integer y; 

    public B(Integer a, Integer b) { 
     super(a); 
     y = b; 
    } 

    public Integer getY() { 
     return y; 
    } 

    @Override 
    protected Integer compareValue() { 
     return getX() + getY(); 
    } 
} 
2

예 : 잘못된 디자인입니다. 특히, 과도 성을 위반합니다. Comparable Javadocs에서 :

구현할 경우 또한 관계는 전이 있는지 확인해야합니다 : (x.compareTo(y)>0 && y.compareTo(z)>0)x.compareTo(z)>0을 의미한다.

상속을 도입하면 지나치게 유용하지 않게됩니다. 당신의 A.compareTo(B) 방법은 실제로 아무것도 무시하지 않으며, 당신이 List<A> 모두 AB을 포함 Collections.sort()에, 그것은 A 인스턴스에 대한 A.compareTo(A) 방법과 B 인스턴스에 대한 B.compareTo(A) 방법을 사용하여 끝낼 것 통과 그렇다면 때문이다. 작성한대로 이 아니라이 아니므로 비교를 취소하면 정렬 순서가 변경 될 수 있으므로 예기치 않은 순서가 발생합니다.

필자는 유사한 응답 w.r.t를 작성했습니다. Object.equals 그리고 왜 다시 오버로드 할 수 없으며 here을 찾을 수 있습니다.

+0

감사합니다. 매우 도움이됩니다. 코드를 개선하여 구조를 개선하는 방법을 알고 싶습니까? 고맙습니다. – CodingNow

+1

OldCurmudgeon의 구조 조정은 서브 클래스가 'compareTo' 메소드를 대체하여 다른 것을 수행하지 않는 한 작동합니다. 'compareTo' 메서드를'final'으로 만들어서 강제 할 수 있습니다. – Brian