2013-03-11 12 views
0

這是問題所在。我有一個抽象基類Editor。我也有兩個小類GraphEditorTreeMapEditor。的TreeMapEditor實現基本包裝了一個GraphEditor和現在基本上所有轉發請求到底層GraphEditor如何修復客戶端代碼,以便通過組合重新獲得代碼?

class TreeMapEditor extends Editor{ 
private final Editor wrappedEditor = createWrappedEditor(); 

private createWrappedEditor(){ 
    return new GraphEditor(); 
} 

public void doA(){ //This is the abstract class defined in Editor. 
    wrappedEditor.doA(); 
} 

public void doB(){ //This is the abstract class defined in Editor. 
    wrappedEditor.doB(); 
} 

public Editor getWrappeEditor(){ 
    return this.wrappedEditor ; 
} 

} 

現在我的想法是重用GraphEditor代碼沒有真正繼承GraphEditor(因此組成)。但是,客戶端代碼被寫入的GraphEditor而不是僅僅Editor實施。我如何在這裏重構這段代碼?我希望所有的通話屬於Editor要經過TreeMapEditor,只有更具體的呼叫要經過GraphEditor

客戶端代碼看起來像現在這樣:

public clientCode(Editor editor){ 
    GraphEditor graphEditor = (GraphEditor)editor; 

    graphEditor .doA(); //This method belongs to Editor() 
    graphEditor .doB(); //This method belongs to Editor() 


    graphEditor .doC(); //This method belongs to GraphEditor() only and not to TreeMapEditor 
    graphEditor .doD();//This method belongs to GraphEditor() only and not to TreeMapEditor 

} 

}

+0

爲什麼客戶端的代碼寫入到只接受'GraphEditor's?是否有一些特定於'GraphEditor'的函數,並不是所有的'Editor'都有(但是'TreeMapEditor's也有)?如果是這樣,繼續定義一個新的接口,使兩個編輯器實現接口,並鼓勵客戶端重構代碼以接受新接口類型的任何參數,而不是隻接受GraphEditor。 – wchargin 2013-03-11 16:07:29

+0

我想知道這裏正在建模什麼。我們可以對類進行各種擴展和實現,但是每個類都應該在您的編程環境中代表一種「事物」(或「事物類型」)。如果TreeMapEditor實際上是GraphEditor的特例,那麼繼承是適當的,我們可以討論如何最好地實現它。但是你似乎描述了某種混合動力,所以我想回過頭來看看我們想要在更高層面上做些什麼。 – arcy 2013-03-11 16:11:47

+0

@rcook TreeMapEditor是不是真的'GraphEditor'但基本上使用的代碼'GraphEditor'for一些operations.It可以另外重寫一些GraphEditor'的'的行爲,並可能會增加只有屬於'TreeMapEditor'操作。使其擴展GraphEditor將違反LSP原則。 – Geek 2013-03-11 16:15:35

回答

1

你可能想尋找GraphEditor之間的概念,你的另外兩個;在你正在做的事情中是否有一個構造可以用擴展GraphEditor但不是全功能的GraphEditor或TreeMapEditor的類來表示?如果有的話,通用的代碼可能會在其中。

不過,我會小心地保持在你的問題空間實現的東西表現形式,而只是把方法爲類在繼承層次,因爲這就是你需要他們。創建類的自下而上的風格可能會導致設計不佳,很難理解,直到有人說「哦,他只是想在這裏使用這種方法。」。

相關問題