2017-04-16 77 views
5

我正在进行物理模拟。父母和孩子之间的设计建议?

我有一个ArrayList,它包含我仿真中的所有对象。我有一个父类:Shape,和两个子类:CircleRectangle

父类当然没有draw()方法,但是每个子类都有。因此,当我通过列表循环绘制每个元素时,它不允许我,因为Shape类中没有draw()方法(因为我将列表定义为ArrayList<Shape>,并添加了每个新元素一个子类实例)。

有没有办法以一种很好和整洁的方式解决这个问题?

+2

你想要一个'abstract'方法。 – SLaks

+0

我试图定义形状类为抽象,然后添加抽象方法绘制,但仍然没有工作@SLaks – Robot0110

+0

如果你真的在ArrayList中创建一个圆形对象,那么它将工作得很好 – 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()'方法,所以我会将接口命名为'Drawable',而不是'Shape'。 – 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类:

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

现在考虑这两个CircleRectangle有型Shape,可以像这样在每个对象上创建Circle型或/和Rectangle的目的,将它们添加到ArrayList,迭代它,并调用Draw()方法:

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

Draw()方法对每个调用结果object:

Circle 
Rectangle 
0

这就是我该怎么做的。

称为形状的类,有一个字段用于列表< 形状> 形状是一个接口保持方法平局()的getArea()或任何其他。 有尽可能多的类实现形状,圆形,矩形,正方形等