어떻게 제한된 형식 매개 변수와 메소드가 하나 개의 서브 클래스를 제외 할 수 있습니까?

K 남자 :

우리가 긴팔 원숭이, 오랑우탄, 고릴라, 침팬지와 인간이 모든 원숭이가 있다고 가정하자. 나는 따라이 관계를 모델링했다.

class Ape {}
class Gibbon extends Ape {}
class Orangutan extends Ape {}
class Gorilla extends Ape {}
class Chimpanzee extends Ape {}
class Human extends Ape {}

지금은 사냥 원숭이에 대한 경계 유형 매개 변수와 사냥 () 메소드를 작성합니다.

public static <T extends Ape> void hunt(T type) {}

우리가 그들은 단지 동물이기 때문에 사람이 아닌 원숭이 사냥에 아무것도 잘못이 있다고 가정 해 봅시다. 그것은 살인이기 때문에, 인간을 사냥하는 것은 잘못된 것입니다. 어떻게 제한된 형식 매개 변수 위 법적 매개 변수로 인간을 제외 다시 쓸 수있다? 나는 여기에 예외에 관심이 아니에요. 나는 인간의 매개 변수와 함께 호출하면 사냥 () 메소드가 전혀 컴파일하고 싶지 않아요.

토니 _008 :

당신은 당신이하고자하는 특정 서브 클래스 방식을 배제 할 수 없다. 당신이 그러나 할 수있는 것은, 당신이 사냥하려는 요구 동물에 의해 구현 된 인터페이스 'isHuntable'를 만드는 것입니다, 당신은 당신의 방법 대신에 바인드 된 제네릭 형식의 형식으로 그 사용합니다. 또 다른 어쩌면 덜 우아한 해결책은에서 연장 모든 동물을 가지고, 원숭이에서 확장 예를 들어 '원숭이'라는 계층 구조의 다른 수준을 만드는 것입니다, 당신은 당신의 방법에 대한 그 원숭이 형식을 사용합니다. 비록 첫 번째 방법으로 갈 것. 당신은 명시 적 유형 검사를 사용할 수 있지만,이 유형의 시스템에 그 검사를 활용하는 것이 좋습니다 그래서 당신은 당신의 코드에서 '오픈 폐쇄'원칙을 깨는 것입니다.

그냥 슬프게 과소되는 강력한 도구입니다 인터페이스 동작 계약의 개념에 조금 연장. 당신이 당신의 원숭이 사이에있는 것은 "입니다-는"관계를 긴밀하게 커플 피사체입니다. 반면에 "Huntable을"이기 때문에, 해당 계층 구조의 고유 또는 특성을 정의하지 않고, 더 추가 조건 / 동작입니다 / 당신이 그 계층 구조의 하위 집합에 추가 할 확인하십시오. 즉 더 나은 당신이 그 동작을하려는 부분 집합에 대한 계약 (인터페이스 구현)를 추가함으로써 달성된다. 즉 최소한의 리팩토링, 최대 의미 선명도, 적은 버그와 긴밀하게 행동 유형을 경계하지 않고 미래에 더 계약 (인터페이스 구현)를 추가 할 수 있습니다. 즉, 당신은 Liskov 대체 원칙,도 개방 폐쇄 원칙을 아프게하지 않습니다

추천

출처http://43.154.161.224:23101/article/api/json?id=315188&siteId=1