2014-02-28 60 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