我正在进行物理模拟。父母和孩子之间的设计建议?
我有一个ArrayList
,它包含我仿真中的所有对象。我有一个父类:Shape
,和两个子类:Circle
和Rectangle
。
父类当然没有draw()
方法,但是每个子类都有。因此,当我通过列表循环绘制每个元素时,它不允许我,因为Shape
类中没有draw()
方法(因为我将列表定义为ArrayList<Shape>
,并添加了每个新元素一个子类实例)。
有没有办法以一种很好和整洁的方式解决这个问题?
我正在进行物理模拟。父母和孩子之间的设计建议?
我有一个ArrayList
,它包含我仿真中的所有对象。我有一个父类:Shape
,和两个子类:Circle
和Rectangle
。
父类当然没有draw()
方法,但是每个子类都有。因此,当我通过列表循环绘制每个元素时,它不允许我,因为Shape
类中没有draw()
方法(因为我将列表定义为ArrayList<Shape>
,并添加了每个新元素一个子类实例)。
有没有办法以一种很好和整洁的方式解决这个问题?
最先进的方法是使用接口。
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类实现外形和使用该抽象类扩展子类。
它似乎为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");
}
}
现在考虑这两个Circle
和Rectangle
有型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
这就是我该怎么做的。
称为形状的类,有一个字段用于列表< 形状> 形状是一个接口保持方法平局()的getArea()或任何其他。 有尽可能多的类实现形状,圆形,矩形,正方形等
你想要一个'abstract'方法。 – SLaks
我试图定义形状类为抽象,然后添加抽象方法绘制,但仍然没有工作@SLaks – Robot0110
如果你真的在ArrayList中创建一个圆形对象,那么它将工作得很好 – abcOfJavaAndCPP