2009-05-04 8 views
2

"shape"라는 추상 부모 클래스가 있고 여러 개의 하위 클래스 (삼각형, 사각형, 원형 ​​...)가 있다고 가정 해 보겠습니다. 모든 하위 클래스가 구현해야하는 부모 "모양"클래스에서 추상 메서드를 정의하려면 "draw"라고 해 봅시다. 그래서 모든 도형 하위 클래스는 "draw()"메서드를 제공해야합니다. 그러나 draw 메소드는 "Stencil"유형의 매개 변수를 사용하며 모든 모양 하위 클래스가 스텐실을 사용할 수있는 것은 아닙니다 ...재정의 된 메서드에서 특수 매개 변수를 사용할 수 있습니까?

따라서 하나의 추상 "모양"클래스, 여러 모양 하위 클래스 및 여러 스텐실이 있습니다. 셰이프 클래스에 정의 된 draw 메서드가 필요합니다. 사각형은 스텐실 1을 사용하고 원은 스텐실 2를 사용할 수 있습니다.

제네릭이 트릭을 수행 할 것으로 추측하고 있지만 확실하지 않습니다. 각 도형 하위 클래스는 다른 클래스에서도 사용되므로 특정 스텐실로 그리기 메서드를 정의해야하며 컴파일러는 모든 프로그래머가 해당 클래스에서 지원하는 스텐실로 그리기 메서드를 호출하도록해야합니다. 프로그래머가 모든 스텐실을 사각형 클래스로 전달할 수 있기 때문에 "public abstract void draw (Stencil s)"와 같은 추상 메서드를 정의 할 수 없습니다. 사각형 클래스는 "Stencil1"만 지원합니다.

아이디어가 있습니까?

갱신 1 : 는 서브 클래스가 너무 다른 클래스에서 사용되기 때문에 모양 클래스는 서브 클래스에 의해 사용되는 스텐실 신경,하지만하지 않습니다 추가해야합니다, 그것은 그리기 방법은 수 있도록 정의하는 것이 중요에만 지원되는 스텐실은 컴파일러에서 허용됩니다. 이 컴파일 시간에 잡힐하려면

+0

제외 모양 클래스는 관리, 당신이 명시된 바와 같이 있기 때문에, "그 클래스에서 지원하는 스텐실과 무승부 메소드를 호출하는 모든 프로그래머를 강제해야 컴파일러가" – cgp

+0

아니, 모양 클래스는하지 않습니다 않는 것을 케어; 신경 써는 다양한 Shape 클래스의 다른 용도입니다. – user85116

답변

7
public abstract class Shape<S extends Stencil> 
{ 
    public abstract void draw(S stencil); 
} 

public class Square extends Shape<Stencil1> 
{ 
    public void draw(Stencil1 stencil) 
    { 
    stencil.letsdo(); 
    stencil.some(); 
    stencil.drawing(); 
    } 
} 

public class Circle extends Shape<Stencil2> 
{ 
    public void draw(Stencil2 stencil) 
    { 
     stencil.some(); 
     stencil.more(); 
     stencil.drawing(); 
    } 
} 
+1

추상 메소드 그리기의 메소드 시그니처와 일치하지 않는 구현 메소드 시그니처가 아닌가? –

+0

아니요, 실제로. 난 그냥 이클립스에서 이것을 테스트하고, 잘 작동합니다. –

+0

번호 draw()는 S를 취하도록 정의됩니다.이 S는 유형 스텐실 또는 서브 클래스이어야합니다. Square/Circle에서는 사용할 스텐실 서브 클래스 만 지정합니다. 여전히 스텐실로서 슈퍼 클래스의 메소드 서명과 충돌하지 않습니다. – alasdairg

0

은 다음과 같은 옵션이 마음에 와서 :

  • 추상적 인 스텐실의 집합을 만듭니다. 특히 당신이 그들을 그룹화 할 수 있다고 생각한다면. 그래서 만약 여러분이 여러 개의 "스퀘어"스텐실을 가지고 있다면, SquareStencil 추상 타입을 생성하고 그것으로부터 구체적인 인스턴스를 파생 시키십시오. 그것들을 추상 Stencils 클래스의 하위 집합으로 만들 수도 있습니다.
  • 그리기 방법을 오버로드하십시오. 그것이 일반적 일 필요는 없습니다. 컴파일러가 작업에 적합한 방법을 선택하면 도움이됩니다.
+0

과부하가 걸리면 문제가 악화됩니다. 그렇습니까? 나는 여러 버전의 무승부를 원하지 않는다. 그 클래스에 맞는 올바른 스텐실 만 허용하는 버전을 원합니다. – user85116

1

아마도 초기 디자인을 재고해야한다고 생각합니다.

물론 일 수 있습니다. instanceof 등을 사용하여이 문제를 해결할 수 있습니다. 그러나 이로 인해 매우 혼란스러운 API가 생성됩니다 (사용중인 경우).

+0

나는 디자인이 내 설명에서 혼란스럽게 들릴 것이라고 확신하지만 실제로 그렇게 나쁘지는 않다. – user85116

0

abstact 스텐실을 정의하고 사용할 스텐실 클래스를 하위 클래스 생성자가 결정하도록합니다.

private Stencil s; 

public void draw(){ 
    privateDraw(s) 
} 

private abstract void privateDraw(Stencil s); 
관련 문제