2012-09-12 4 views
0

작은 게임 용 내 단위를 그려야하는 두 개의 클래스를 디자인하고 싶습니다. 나는 UnitSettlerUnit까지 확장되는 수업을 가지고 있습니다.상속 클래스 디자인 (Java)

그 (것)들을 그리기 위하여 나는 종류 UnitViewSettlerView가있다.

이제 UnitViewpublic void draw(Graphics g)SettlerView 같은 방법을 사용해야합니다. 두 클래스의 차이점은 유닛을 그리는 데 필요한 정보를 얻는 방법에 있어야합니다. Units은 항상 파란색이며 Settlers은 건강 상태에 따라 색상이 달라집니다 (에 액세스 할 수있는 Settler의 필드가 됨).

구현 방법은 무엇입니까? setColor과 같은 공개 방법이없는 깨끗한 디자인이 필요합니다.

편집 : 이것은 내 첫 번째 방법이었다

내가 UnitView.draw를 호출하는 다형성을 사용하려면
public class UnitView { 
    private Unit unit; 
    public Color color; // I don't want to make it public. Setting it private + getter/setter does not seem to be different to me. 
    private color calculateColor() { ...uses the information of unit... } 
    public void draw(Graphics g) { ...something using the Color... } 

} 

public class SettlerView extends UnitView { 
    private Settler settler; 

    private color calculateColor() { ...this method overides the one of UnitView.... } 
} 

. 중요한 것은 Public 필드 Color입니다.

+1

멤버 변수에 대한 접근 자 및 변경자는 캡슐화의 핵심이며 깨끗한 디자인의 일부입니다. 당신은 그들을 피하려고 노력해서는 안됩니다. – Borgleader

+0

Draw() 메서드가 포함 된 인터페이스 IView를 만들고 UnitView 및 SettlerView에서 IView를 구현합니다. *보기를 사용하는 곳이면 어디에서나 IView 인터페이스를 사용하십시오. 인터페이스는 필드를 가질 수 없으므로 접근 자 메소드 getColor()를 작성하여 IView 인터페이스에 추가해야합니다. – ryan0

답변

0

항상 부모 그리기 방법을 무시할 수 있습니다. A로부터 파생한다

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

UnitView 및 SettlerView :

그래서 예를 들어 부모 방법은 하위 클래스가

@Override 
public void draw(Graphic g){   
    if (this.health > 50){ 
     g.setColor(green); 
    }else{ 
     g.setColor(red); 
    } 
    super.draw(g); // if you want to call the parent draw and just change color 
} 
+0

답변 해 주셔서 감사합니다. draw (Graphic g)는 복잡한 함수이며 색상 만 변경되었으므로 parentclass 구현을 사용하려고한다고 가정합니다. – Elrond1337

+0

자식 드로잉 내에서 super.draw 사용 –

+0

그러나 변경된 색상은 어떻게 알 수 있습니까? – Elrond1337

1

은 다형성 (polymorphism)에 대해 알아해야합니다

public void draw(Graphic g){ 
    g.setColor(blue); 
} 

경우 draw() 메서드를 사용하여 기본 클래스를 만듭니다. 모든 하위 클래스에서이를 구현해야하므로 추상적으로 만들 수 있습니다.