문제

"Shape"라는 추상적 인 부모 클래스가 있고 여러 개의 서브 클래스 (삼각형, 정사각형, 원 ...)가 있다고 가정 해 봅시다. 나는 모든 서브 클래스가 구현 해야하는 부모 "shape"클래스에서 추상적 인 메소드를 정의하고 싶습니다. 따라서 모든 모양 하위 클래스는 "Draw ()"메소드를 제공해야합니다. 그러나 드로우 방법은 "스텐실"유형의 매개 변수를 취하며 모든 형태의 서브 클래스가 스텐실 만 사용할 수있는 것은 아닙니다.

따라서 하나의 추상 "모양"클래스, 다중 모양 하위 클래스 및 다중 스텐실이 있습니다. 모양 클래스에 정의 된 드로우 방법이 필요합니다. 사각형은 Stencil1을 사용할 수 있고 원은 Stencil2를 사용할 수 있습니다.

제네릭이 트릭을 할 것이라고 생각하지만 확실하지 않습니다. 각 형상 서브 클래스는 이러한 클래스가 다른 클래스에서도 사용되기 때문에 특정 스텐실의 드로우 메소드를 정의해야하며, 컴파일러는 모든 프로그래머가 해당 클래스에서 지원하는 스텐실과 함께 드로우 메소드를 호출하도록 강요해야합니다. 프로그래머는 스텐실을 사각형 클래스로 전달할 수있는 반면, 정사각형 클래스는 "스텐실 1"만 지원하기 때문에 "공개 초록 void draw (스텐실 S)"와 같은 추상 방법을 정의 할 수 없습니다.

어떤 아이디어?

업데이트 1 :Shape Class는 서브 클래스에서 어떤 스텐실을 사용하는지 신경 쓰지 않지만, 서브 클래스가 다른 클래스에서도 사용되기 때문에 DRAW 방법이 컴파일러에 의해 지원되는 스텐실 만 허용되도록하는 것이 중요합니다.

도움이 되었습니까?

해결책

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();
   }
}

다른 팁

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

물론, 당신 ~할 수 있었다 인스턴스의 등을 사용 하여이 문제를 해결하면 매우 혼란스러운 API가 발생합니다 (그렇다면 사용하는 경우).

컴파일 시간에 이것을 잡으려면 다음 옵션이 떠 오릅니다.

  • 추상 스텐실 세트를 만듭니다. 특히 당신이 그들을 그룹화 할 수 있다고 생각한다면. 따라서 여러 "정사각형"스텐실이 있으면 Squarestencil Abstract 유형을 만들고 콘크리트 인스턴스를 도출하십시오. 초록 스텐실 클래스의 서브 세트로 만들 수도 있습니다.
  • 드로우 방법을 과부하합니다. 일반적인 것이 필요하지 않습니다. 작업에 적합한 방법을 선택하여 컴파일러가 도움을 주도록하십시오.

절제 스텐실을 정의하고 서브 클래스 생성자가 사용할 스텐실 클래스를 결정하게하십시오.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top