从超类型arraylist访问子类型方法

时间:2015-04-20 01:16:28

标签: java arraylist polymorphism

我正在学习多态并遇到一些问题。我本来应该制作一个“屏幕保护程序”,不同的图像移动和弹跳。我使用四个子类型Square,Star,Circle和Triangle的数组工作,但是我一次只能有一个类的一个实例(当我点击时,它会形成一个新的形状而旧的形状消失)。

我试图像这样制作一个arraylist:

        public void mouseClicked(MouseEvent e) {

        if (i < 3) {
            i += 1;
        } else {
            i = 0;
        }
        switch (i) {
        case 0:
            shapeArray.add(new Circle());
            break;
        case 1:
            shapeArray.add( new Square());
            break;
        case 2:
            shapeArray.add( new Star());
            break;
        case 3:
            shapeArray.add(new Triangle());
            break;

        }
        shapeArray.get(i).setX(e.getX());
        shapeArray.get(i).setY(e.getY());

        repaint();
        animationTimer.start();
        j += 1;
}

但是当我在paintComponent中调用我的draw方法 -

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.BLACK);

        shapeArray.get(i).draw(g, this);
//      shapeArray.get(i).bounce(g, this);

    }// end paintComponent

- 我从draw方法的调用中得到错误。我是在正确的轨道上吗?如何使用超类arraylist调用子类型的这种方法?

编辑: 抽象超类:

public abstract class Shapes {
    Graphics g;
    protected int width = 0;
    protected int height = 0;
    protected int x = 0;
    protected int y = 0;
    int d = 5;
    int c = 5;
    Random myRandom = new Random();


    protected Color colorArray[] = {new Color(255,0,0),new Color(255,179,0),new Color(255,255,0),
            new Color(7,225,0),new Color(0,127,225),new Color(205,0,255)};
    protected Color color;

    public Integer RandomNum(Integer x){
        myRandom = new Random();
        return myRandom.nextInt(x);
    }
abstract public void draw(Graphics g, JPanel jp);

abstract public void bounce(Graphics g,JPanel jp);
public void setWidth(Integer width) {
    this.width = width;
}

子类构造函数和绘制方法:

public Circle() {
    this.x = 0;
    this.y = 0;
    this.width = RandomNum(100);
    this.height = width;
    this.color = colorArray[RandomNum(6)];
}

public void draw(Graphics g, JPanel jp) {

    Graphics2D g2d = (Graphics2D) g;
    int radius = width;
    Point2D center = new Point2D.Float((x + width / 2), (y + height / 2));
    Point2D focus = new Point2D.Float(x - (radius * 0.6f), y
            - (radius * 0.6f));
    float[] dist = { 0.1f, 0.2f, 1.0f };
    Color[] colors = { Color.WHITE,
            color, color };
    RadialGradientPaint p = new RadialGradientPaint(center, radius, focus,
            dist, colors, CycleMethod.NO_CYCLE);
    if (g2d != null) {
        g2d.setPaint(p);
        int r2 = radius / 2;
        g2d.fillOval(x - r2, y - r2, radius, radius);
    }

    // g.setColor(colorArray[RandomNum(colorArray.length)]);
    // g.fillOval(x, y, width, height);

}

1 个答案:

答案 0 :(得分:0)

好吧,如果你一次只有一个形状,你不需要一个ArrayList开始;只需要一个Shapes类型的变量(或者你的超类被调用的任何变量),你可以在你的那个开关内分配一个新的Circle或者新的Square或者其他任何东西。

但是,使用ArrayList,我发现可能存在两个问题:首先,您可能只是使用基本的ArrayList而不是您的类型的ArrayList(即private ArrayList shapesArray而不是private ArrayList<Shapes> shapesArray) ;第二,你的Shapes类没有抽象的setX / setY方法,因此你在mouseClicked中切换后会出现错误。