[英]How can I fix the client code so that I get code reuse via composition?
這是問題所在。 我有一個抽象基類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和您的另外兩個之間尋找一個概念。 您正在執行的操作中是否有一個結構可以由擴展GraphEditor的類表示,而不是功能齊全的GraphEditor或TreeMapEditor? 如果存在,則可能會包含通用代碼。
但是我會小心地繼續在問題空間中實現某種表示,而不是僅僅將方法放入繼承層次結構中的類中,因為這是您需要它們的地方。 這種自下而上的創建類的樣式會導致糟糕的設計,直到有人說“哦,他只是想在這里使用此方法”之前,否則很難理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.