2017-04-16 4 views
5

저는 물리 시뮬레이션을하고 있습니다.부모 클래스와 하위 클래스 사이의 디자인에 대한 조언?

시뮬레이션에서 모든 객체를 보유하는 ArrayList이 있습니다. 부모 클래스 : Shape 및 두 개의 하위 클래스 : CircleRectangle.

물론 부모 클래스에는 draw() 메서드가 없지만 각 하위 클래스는 수행합니다. 그러므로, 각 요소를 그리기 위해 물음표를 반복 할 때, Shape 클래스에 draw() 메서드가 없으므로 허용하지 않습니다. (목록을 ArrayList<Shape>으로 정의하고 각 요소를 자식 클래스 인스턴스).

좋은 방법으로이 문제를 해결할 수있는 방법이 있습니까?

+2

'추상적'메소드가 필요합니다. – SLaks

+0

추상으로 도형 클래스를 정의하고 추상 메서드 그리기를 추가하려고했지만 여전히 ArrayList의 Circle 객체를 만드는 경우 @SLaks – Robot0110

+0

이 작동하지 않습니다. 그러면 잘 작동합니다. – abcOfJavaAndCPP

답변

4

앞으로 나아갈 수있는 가장 좋은 방법은 인터페이스를 사용하는 것입니다.

public interface Shape { 
    void draw(); 
} 

public class Rectangle implements Shape { 
    @Override 
    public void draw() { // draw rect } 
} 

public class Circle implements Shape { 
    @Override 
    public void draw() { // draw circle } 
} 

당신은 당신이 추가 코드와 함께 AbstractShape 클래스 구현 모양을 만들고이 추상 클래스를 사용하여 하위 클래스를 확장 할 수 있습니다 아이들의와 모양이 다른 논리를 공유합니다.

+2

이 인터페이스는'draw()'메소드 만 선언하므로'Shape' 대신'Drawable' 인터페이스를 사용합니다. – AJNeufeld

+0

@AJNeufeld 예, 좋을 것 같습니다. 전통적으로 인터페이스는 형용사의 이름이어야합니다. – abhipil

4

모든 서브 클래스가 공통적 인 동작을 공유하는 클래스 인 Shape에 대한 추상 메소드를 제공하는 것으로 보인다.

이는 Shape 클래스입니다 고려 :

public abstract class Shapes{ 
    public abstract void Draw(); 
} 

Rectangle 클래스 :

public class Rectangle extends Shapes{ 
    public void Draw(){ 
     System.out.println("Rectangle"); 
    } 
} 

Circle 클래스 : 지금 모두 CircleRectangle 유형의 것을 고려

public class Circle extends Shapes{ 
    public void Draw(){ 
     System.out.println("Circle"); 
    } 
} 

, 당신과 같이 각 개체에 Draw() 방법을 ArrayList의에 추가 입력 Circle 및/또는 Rectangle의 개체를 만들고 그것을 반복하고 호출 할 수 있습니다

ArrayList<Shapes> shapes = new ArrayList<>(); 
shapes.add(new Circle()); 
shapes.add(new Rectangle()); 
shapes.forEach(Shapes::Draw); 

Draw() 방법은 각 호출 결과 개체 :

Circle 
Rectangle 
0

이렇게하면됩니다.

목록 < 모양의 필드가 형태라는 클래스> 모양 인 방법 무승부()의 getArea() 또는 다른 사람을 들고 인터페이스를 제공합니다. 많은 클래스를 구현하십시오. 모양, 원형, 사각형, 사각형 등