Java中抽象类和接口的问题

时间:2012-03-08 03:58:25

标签: java interface abstract-class

我很确定这可能是我愚蠢,但我看起来又高又低,并请一位经验丰富的朋友寻求帮助。但是,我试图从我的抽象形状类中访问x和y并在我的界面中使用它们。但是,我正在打砖墙。我认为最好的选择就是让它们受到保护并以这种方式解决。无论如何,我的问题是,在Moveable的类移动中,我将如何操纵x和y?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package C_I;

import java.awt.*;

/**
 *
 * @author Mouse
 */
public abstract class Shape implements Moveable {
    private int x;
    private int y;
    private Color myColor;
    private Color background;

    public Shape(int tX, int tY, Color tmpColor, Color tmpBackground)
    {
        x = tX;
        y = tY;
        myColor = tmpColor;
        background = tmpBackground;
    }

    public abstract void draw();

    public abstract void clear();

    public abstract void resize(double s);

    public int getX()
    {
        return x;
    }

    public int getY()
    {
        return y;
    }

    public Color getmyColor()
    {
        return myColor;
    }

    public Color getBackground()
    {
        return background;
    }

    public void setX(int tmpX)
    {
        x = tmpX;
    }

    public void setY(int tmpY)
    {
        y = tmpY;
    }

}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package C_I;

/**
 *
 * @author Mouse
 */
public interface Moveable{
    void clear();

    public void move(int alphaX, int alphaY)
    {
        setX(getX() + alphaX);
    }

    void draw();

}

2 个答案:

答案 0 :(得分:3)

您的代码中存在一个非常基本的错误:

您的interface有方法定义。而“在最常见的形式中,interface是一组带有空体的相关方法。”。所以你不能在接口中为方法提供实现。 因此,您可以将move()方法的定义从Moveable接口移到抽象类Shape

编辑:以下是您可以这样做的方法:

public abstract class Shape implements Moveable {
    .....
    public void move(int alphaX, int alphaY)
    {
        setX(getX() + alphaX);
    }
}
public interface Moveable{
    void clear();
    public void move(int alphaX, int alphaY);
    void draw();
}

了解接口@ http://docs.oracle.com/javase/tutorial/java/concepts/interface.html

答案 1 :(得分:0)

如前所述,您不能在界面中拥有方法主体。

如果您希望多个类共享move方法的实现,那么一些基本选项是:

  1. 使Moveable成为抽象类而不是接口
  2. 提供名为Moveable的{​​{1}}的基本实施,并MoveableBase implements Moveable延长Shape