Java - 将对象传递给扩展类

时间:2014-02-28 19:10:56

标签: java

假设我有两个公共类,如下所示:

椭圆类,它将获得宽度和高度参数。

public class Oval extends Shape{
    OvalClass oval;
    public Oval(int width,int height){
        oval = new OvalClass("first",10);
    }

}

和一个Shape类,它应该有任何不同的形式(这就是为什么我要扩展它)。

public class Shape {

    public void moveLeft(){
      //object?
      object.posX += 1;
  }
}

编辑:

  

我们对GOval,其他类和move()方法的了解不够充分。

将另一个OvalClass视为椭圆类:

public class OvalClass {
    String name;
    int posX;
    public OvalClass(String name, int posx){}
}

问题是,如何在Shape类中的Oval中创建object椭圆(GOval oval)? 有没有更好的方法?

4 个答案:

答案 0 :(得分:2)

左右移动不仅仅是椭圆形,也不仅仅是正方形。每个形状都可以向左或向右移动。因此,Shape应包含以下功能:

public abstract class Shape {

    int x;
    int y;

    public void moveLeft(){
        this.x = x - 1;
    }

    ...

    abstract double getArea();
}

为了简洁起见,我遗漏了Shape的其他属性。想象一下,它还有一个向上,向下,向右,以及任何你想要所有形状的东西。

现在,我们创建一个椭圆形。

public class Oval extends Shape {

    int height;
    int width;

    public Oval(int height, int width, int x, int y) {
        super(x, y);
        this.height = height;
        this.width = width;
    }

    public double getarea() { return Math.PI * width * height; }

}

请注意,我们没有告诉Oval如何向左或向右移动。因为它扩展了一个Shape,它已经知道如何向左和向右移动。事实上,我们可以告诉我们的Ovals左右移动就像这样:

Oval o = new Oval(1, 1, 0, 0);
o.moveLeft();

中提琴!我们的Oval可以移动,即使我们没有在我们的Oval类中定义一个名为moveLeft的方法。这就是继承之美 - moveLeft()方法是由我们的椭圆继承的。

答案 1 :(得分:2)

尝试这样的事情:

public class Shape {
  // Now all Shapes can move()
  protected abstract void move(int x, int y);
  public void moveLeft(){
    //object?
    move(-1,0);
  }
}

public class Oval extends Shape {
  private GOval oval;
  public Oval(int width,int height) {
    oval = new GOval(0,0,width,height);
  }
  // Implement move()
  protected void move(int x, int y) {
    oval.move(x, y);// or whatever method on GOval makes it move()
  }
}

HTH

答案 2 :(得分:0)

您是否考虑重写超级moveLeft()?

public class Oval extends Shape{

        GOval oval;
        public Oval(int width,int height){
            oval = new GOval(0,0,width,height);
        }

        @Override 
        public void moveLeft(){

             if (oval != null)
                oval.move(-1,0);

        }

    }

答案 3 :(得分:0)

您可以使用参数化类“Shape<T>”,其具有名为“GOval”的具体几何图形或任何其他类型。

考虑这个课程

public class Shape<T> {

    T oval;
    public void moveLeft(){
            oval.move(-1,0);
  }
}

及其处理程序

public class Oval extends Shape<GOval>{

    public Oval(int width,int height){
        oval = new GOval(0,0,width,height);
    }
}