這是問題所在。我有一個抽象基類Editor
。我也有兩個小類GraphEditor
和TreeMapEditor
。的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
}
}
爲什麼客戶端的代碼寫入到只接受'GraphEditor's?是否有一些特定於'GraphEditor'的函數,並不是所有的'Editor'都有(但是'TreeMapEditor's也有)?如果是這樣,繼續定義一個新的接口,使兩個編輯器實現接口,並鼓勵客戶端重構代碼以接受新接口類型的任何參數,而不是隻接受GraphEditor。 – wchargin 2013-03-11 16:07:29
我想知道這裏正在建模什麼。我們可以對類進行各種擴展和實現,但是每個類都應該在您的編程環境中代表一種「事物」(或「事物類型」)。如果TreeMapEditor實際上是GraphEditor的特例,那麼繼承是適當的,我們可以討論如何最好地實現它。但是你似乎描述了某種混合動力,所以我想回過頭來看看我們想要在更高層面上做些什麼。 – arcy 2013-03-11 16:11:47
@rcook TreeMapEditor是不是真的'GraphEditor'但基本上使用的代碼'GraphEditor'for一些operations.It可以另外重寫一些GraphEditor'的'的行爲,並可能會增加只有屬於'TreeMapEditor'操作。使其擴展GraphEditor將違反LSP原則。 – Geek 2013-03-11 16:15:35