假设我有两个公共类,如下所示:
椭圆类,它将获得宽度和高度参数。
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
)?
有没有更好的方法?
答案 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);
}
}