这是问题所在。我有一个抽象基类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
}
}
答案 0 :(得分:1)
您可能希望在GraphEditor和其他两个之间寻找一个概念;你正在做什么的构造可以用扩展GraphEditor但不是全功能的GraphEditor或TreeMapEditor的类来表示?如果存在,公共代码可能会进入其中。
但是我会谨慎地继续在你的问题空间中实现某种东西的表示,而不是仅仅将方法放入继承层次结构中的类中,因为这就是你需要它们的地方。自下而上创建类的风格可能导致设计不佳,难以理解,直到有人说“哦,他只是想在这里使用这种方法。”。