我正在进行物理模拟。
我有一个ArrayList
来保存模拟中的所有对象。我有一个父类:Shape
和两个子类:Circle
和Rectangle
。
父类当然没有draw()
方法,但每个子类都有。{1}}方法。因此,当我循环遍历列表以绘制每个元素时,它不允许我,因为draw()
类中没有Shape
方法(因为我将列表定义为ArrayList<Shape>
,并使用子类实例添加每个新元素。)
有没有办法以一种良好而整洁的方式解决这个问题?
答案 0 :(得分: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");
}
}
现在考虑到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()
方法时的结果:
Circle
Rectangle
答案 1 :(得分:4)
前进的最佳方式是使用接口。
Select * from (
SELECT * FROM `mychair` LEFT JOIN `mytable` ON
mytable.Leg1 = mychair.Back1
UNION
SELECT * FROM `mychair` RIGHT JOIN `mytable` ON
mytable.Leg1 = mychair.Back1) t
WHERE t.Leg1 = 'A'
如果你想让Shape与它的子节点共享一些其他逻辑,你可以使用任何附加代码创建一个实现Shape的AbstractShape类,并使用这个抽象类扩展子类。
答案 2 :(得分:0)
我就是这样做的。
一个名为Shapes的类,其中包含List&lt; Shape &gt;的字段。 Shape 是一个包含方法draw()getArea()或其他任何方法的接口。 有尽可能多的类实现形状,圆形,矩形,方形等。