这是问题所在。我有一个抽象基类Editor。我也有两个子类GraphEditor和一个TreeMapEditorTreeMapEditor的实现基本上包装了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?如果存在,则可能会包含通用代码。

但是我会小心地继续在问题空间中实现某种表示,而不是仅仅将方法放入继承层次结构中的类中,因为这是您需要它们的地方。这种自下而上的创建类的样式会导致糟糕的设计,直到有人说“哦,他只是想在这里使用此方法”之前,否则很难理解。

10-07 16:12