父类和子类之间的设计建议?

时间:2017-04-16 02:27:34

标签: java class parent-child simulation

我正在进行物理模拟。

我有一个ArrayList来保存模拟中的所有对象。我有一个父类:Shape和两个子类:CircleRectangle

父类当然没有draw()方法,但每个子类都有。{1}}方法。因此,当我循环遍历列表以绘制每个元素时,它不允许我,因为draw()类中没有Shape方法(因为我将列表定义为ArrayList<Shape>,并使用子类实例添加每个新元素。)

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

3 个答案:

答案 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");
    }
}

现在考虑到CircleRectangle都属于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()或其他任何方法的接口。 有尽可能多的类实现形状,圆形,矩形,方形等。