2013-11-21 4 views
0

가끔 서브 클래스 (예 : Pawn 또는 Bishop)가 const (final) 속성을 구현하도록하는 수퍼 클래스 (예 : ChessFigure)의 속성이 필요합니다. 예를 들어, 모든 체스 피규어는 자체 Image를 가지고 있지만, 그것은 static입니다 (그러나 하위 클래스에는 고정적이어서 슈퍼 클래스에서는 정적으로 사용할 수 없습니다) 그리고 final입니다.하위 클래스에 보호 된 최종 인스턴스 변수 정의 강제로

어떻게 이것을 수퍼 클래스 ChessFigure에서 전문적인 방법으로 구현할 수 있습니까?

+1

필드 (속성) 대신 '추상적 인'게터를 고려 했습니까? 콘크리트 하위 클래스는 강제로 구현됩니다. – vikingsteve

+0

@vikingsteve 예, 그것이 현재 나의 "해결책"입니다. –

답변

0

아마도 읽기 전용 속성이 필요합니다. final이 유일한 방법은 아닙니다. 내 예제에서는 클래스가 이미지의 경로를 가져올 수 있지만 패키지의 하위 클래스와 클래스 만 경로를 변경할 수 있습니다.

public abstract class ChessFigure { 
    private static String imagePath; 

    protected static void setPath(String imagePath) { 
     this.imagePath = imagePath; 
    } 

    public static String getPath() { 
     return imagePath; 
    } 
} 
+0

그러나이 방법으로 모든 하위 클래스는 설정 한 후에 동일한 imagePath를가집니다. 예 : 내 chessFigureArray에있는 모든 요소의 getImagePath를 호출하면 동일한 imagePath가 반환됩니다. –

+0

종종 통계를 사용하는 것은 좋지 않습니다 ... – vikingsteve

1

당신은 독립적으로 (예를 들어, 공용 보호 전용)의 액세스 개질제, 변수를 선언하는 서브 클래스를 강제 할 수 없다.

@vikingsteve 언급했듯이 각 하위 클래스가 필요에 따라 재정의하는 추상 메서드를 사용하는 것이 가장 좋으며 아마도 하위 클래스에서 정의 된 상수 값을 참조 할 수 있습니다.

게다가 코드에서 하드 코드 된 상수 대신 체스 피규어의 이미지를 정의하는 속성 파일을 사용하여 구현을 나중에 변경하고 싶을 수도 있습니다. 올바른 이미지 (상수를 반환하거나 속성 파일을 읽는 것)를 찾기위한 논리를 캡슐화하는 메서드를 사용하면 코드의 진화와 유지 관리를 용이하게 할 수 있습니다.

+0

예, 현재 해결책입니다. 그러나 추한 것은 모든 서브 클래스에서 ImagePath (또는 Spritesheet 위치)의 최종 속성을 작성해야한다는 것입니다. getter가 동일하고 최종 속성이 동일하므로 DRY와 다릅니다. –

+0

하지만 그게 최선의 해결책 일 것입니다. 이러한 이미지를 참조하기 위해 상수를 사용하는 경우 모두에 대한 일반 이름 대신 해당 상수 변수의 이름을 나타내는 실제 이미지 (예 : 'PAWN_IMAGE', 'BISHOP_IMAGE'등)로 이름을 지정할 수도 있습니다. – Sergio

1

당신의 디자인은 복잡합니다. 더 나은 솔루션은 열거의 생성자 내에서 초기화하면

enum ChessFigure { 
    KING, QUEEN, ROOKS, KNIGHTS, BISHOPS, PAWNS; 
    Image blackImage, whiteImage; // to be filled 
} 

이미지 변수

final를 선언 할 수있다.

또는, 당신은 프리젠 테이션에서 논리를 분리하려면 :

enum ChessFigure { 
    KING, QUEEN, ROOKS, KNIGHTS, BISHOPS, PAWNS 
} 

...

// within presentational code: 
EnumMap<ChessFigure,Image> blackFigureImages; 
EnumMap<ChessFigure,Image> whiteFigureImages; 

당신은 변경 가능한 숫자, 예를 들어, 생각하는 경우 보드 위치를 유지하기 위해 다른 클래스를 사용할 수 있습니다 (예 :

class BoardFigure { 
    final ChessFigure type; 
    int row, column; 
} 
관련 문제