2011-02-13 73 views
1
public abstract class Figure 
{ 
    private int offset; 

    public Figure() 
    { 
    offset = 0; 
    } 

    public Figure(int theOffset) 
    { 
    offset = theOffset; 
    } 

    public void setOffset(int newOffset) 
    { 
    offset = newOffset; 
    } 

    public int getOffset() 
    { 
    return offset; 
    } 

    public abstract void drawHere(); 

    /** 
    * Draws the figure at lineNumber lines down from the 
    * current line. 
    */ 

    public void drawAt(int lineNumber) 
    { 
    int count; 
    for(count = 0; count < lineNumber; count++) 
     System.out.println(); 
    drawHere(); 
    } 
} 

在這個類中,它處理創建樹的圖。我試圖通過簡單地給抽象方法給一個實體來把它變成一個普通的類。我注意到,當我刪除抽象標籤時,它仍然正常工作。但是我的問題是,如果我想讓班級變得非抽象,我會通過什麼方式來做到這一點?Java - 抽象類到普通類

這個類被另外兩個類擴展,然後它有主類。我是否也必須通過並修改它們?

+0

圖上擴展的兩個類是Box和Triangle,它們不是抽象的。唯一抽象的類是圖。我會用一個方法來繪製這個圖來代替'public abstract void drawHere();'完成摘要的刪除?這是爲了強調抽象標籤的易用性。 – Mike 2011-02-13 23:22:58

回答

0

如果你想要一個非抽象類,那麼你不能用abstract修飾符聲明它(即只是public class Figure)。不應該有任何需要修改任何派生類(只要它們本身不是抽象的)。

2

你不應該改變圖;你應該擴展它。

該類由2其他 類後延伸,並且然後它具有主 類。我是否必須經過並修改這些? ?

所有更多的理由不改變圖:你會打破其餘的代碼。

你不應該修改任何東西。創建一個擴展圖的新類,並用你想要的行爲重寫抽象drawHere()方法。

0

從技術上講,爲了使一個抽象類,非抽象的,你必須:

  • 所有抽象方法的實現
  • 既然你現在所擁有的一切的有效實施定義,刪除所有抽象標籤

沒有必要修改繼承類中的任何東西(假設它們是非抽象的),因爲它們已經提供了其父的所有抽象方法的實現可以自由覆蓋他們希望的任何方法。

你是否應該讓你的班級不抽象是另一個討論點。

0

刪除abstract關鍵字並實現抽象方法使得該類非抽象是正確的。

但是,您通常不希望將類本身從抽象轉換爲非抽象。除非添加此關鍵字,否則類不是抽象的,所以您(或其他人)顯然有理由確定它不是普通類,而是抽象類。

如果您在非常高的層次上(遠離Java)思考它,那麼您就會知道如何繪製「樹」。同樣,你可以想象一個子類「圈子」,你知道什麼樣的圖畫看起來像。然而,對於非常通用的「圖」,你不知道它的意思。

這就是爲什麼實際的繪製在你Figure類離開abstract的想法。因此,你不應該讓Figure非抽象的,而是通過實現Figure中的所有抽象方法來關注從它延伸出來的類並使這些非抽象類。在您的Tree課程中,您知道drawHere應該做什麼,因此在此處執行以打印樹。在另一個班級中,例如Circle,您的實施方式有所不同,但在Figure中執行此操作永遠不會有意義,因爲您不知道要繪製什麼內容。

0

你可以聲明的方法體drawHere()(大概是空的,因爲,正如@Frank指出的那樣,你不能真正有關於如何繪製Figure任何想法),然後卸下abstract修飾。然後你會有一個具體的課程。這意味着有人可以創建一個new Figure()。這不是你現在擁有的兩個子類中的任何一個,只是一個Figure

如果這樣一個對象(當它被調用到drawHere()時什麼也不會)沒有用(特別是,如果你認爲有這樣一個對象是錯誤的),那麼你應該保持類抽象。即使您可以爲每種方法定義實現,此推理仍然適用。

2

當你有一個抽象類,

abstract class AbstractCar { 

    float maxSpeed; 
    Driver whoIsDriving; 

    AbstractCar(float ms, Driver d) { 
     maxSpeed = ms; 
     if(!validateDriver(d)) throw new InvalidDriverException(); 
     whoIsDriving = d; 
    } 

    abstract boolean validateDriver(Driver d); 

} 

您可以通過擴展和界定問題的抽象方法分別定義了各種條件下的行爲。

class CrappyCar extends AbstractCar {  
    boolean validateDriver(Driver d) { 
     return d.hasLicense() && d.hasInsurance(); 
    } 
} 

class ExpensiveCar extends AbstractCar { 
    boolean validateDriver(Driver d) { 
     return d.hasLicense() && d.hasInsurance() && d.hasGoodJobInCaseHeMessesUpMyCar(); 
    } 
} 
0

如果一個類是由抽象的,你可以給身體所有methodes或沒有這些,但如果任何類擴展抽象類,它必須實現所有這些只被宣佈梅索德。