2013-08-25 57 views
2

如果我正在編寫繪製形狀的程序。我什麼時候需要使用抽象方法?

abstract class GraphicObject { 

    abstract void draw(); 
    abstract void resize(); 
} 

然後擴展GraphicObject的子類稱爲Circle。

class Circle : GraphicObject { 
    void draw() { 
    ... 
    } 
    void resize() { 
     ... 
    } 
} 

這樣處理它會有意義嗎?當然,一些繪圖代碼將會重複嗎?

所以:

abstract class GraphicObject { 

    public virtual void draw() 
    { 
     // all objects will need to be drawn in a similar way, do this here. 
    } 
} 

,然後在我的圈子裏做類所有獨特的東西到圓

public override void draw() { 
    //Do unique circle drawing stuff here 
    base.draw(); 
} 

然後調用基抽籤方法,在完成該方法的結束。

我很難看到一個場景,我需要真正使用抽象方法而不用某種形式重複代碼。

回答

3

考慮虛擬方法返回值的情況。考慮它用於因爲它沒有提上Factory任何責任實際上產生Node價值創造價值

class Factory { 
    public abstract Node CreateNode(); 
} 

一種抽象方法,效果很好這裏是工廠式的方法。相反,它只是宣佈應提供Node。如果您改爲虛擬方法,那麼Factory必須選擇一個默認值。如果它不知道它是什麼類型的工廠,它怎麼能產生一個Node

public virtual Node CreateNode() { 
    return ???; 
} 
1

除非在繪圖調用的開始或結束時您必須完成所有形狀的事情,否則您不會在抽象類中放置代碼來執行此操作。

如果在繪製過程中有不同的點需要做的事情,那麼你可以把它們放在抽象類中,比如說保護方法;只有繼承的類才能夠調用它們,並將這些通用代碼放到一個地方。

抽象方法的使用是爲了確保(1)使用形狀的類可以訪問這些方法,而不必知道它擁有引用的子類。因此,例如,一個頁面可以有一個形狀列表,並且每一個都可以調用draw(因爲它是在超類中定義的),即使每個都是特定的子類形狀。如果draw()未在形狀中定義,則不能在列表中調用每個形狀的繪圖。

(我對java更熟悉,並且使用了java術語 - 我認爲你更熟悉別的東西,給定繼承的格式和「base」的用法。

相關問題