2014-02-28 46 views
0

假设我有两个公共类,如下面的公共类: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){} 
} 

的事情是,我怎么能得到object椭圆形的椭圆形的形状类创建(GOval oval)? 有没有更好的方法?

+3

我们不知道有足够的了解GOval,其他类和move()方法给出很好的答案。 –

+0

没有进一步的信息,这完全没有意义。为什么你会有一个GOval形状?形状是一般的,你说,所以它怎么可能知道一个椭圆形,即使它是GOval?没有意义 – iberbeu

+0

GOval也是一个形状?你是否也有源代码,所以我们可以看到它是什么? –

回答

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; } 

} 

请注意,我们不必告诉椭圆如何向左或向右移动。因为它扩展了Shape,它已经知道如何左右移动。事实上,我们可以告诉我们的椭圆形就像这样左右移动:

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

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

+0

我认为“对象”应该代表GOval访问。 – pL4Gu33

+1

@ pL4Gu33你为什么这么想?并非所有的形状都有椭圆形。 – Rainbolt

+0

ohh sry missunderstanding,my fault – pL4Gu33

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

+0

这将导致StackOverflowException与您现在的代码。移动移动移动移动... – Rainbolt

+0

我看不到它。 –

+0

我也没有。缩回。 +1为我的无知。 – Rainbolt

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); 

     } 

    } 
+0

'moveLeft()'应该对所有形状都一样。 – zurfyx

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); 
    } 
} 
+0

我似乎无法获得'concreteShape'的类功能。 – zurfyx

+0

它只是“椭圆形”的另一个名称。现在是名称“椭圆形”。 –

+0

'找不到符号',这正是我的IDLE所说的。 – zurfyx