0

这就是问题所在。我有一个抽象基类Editor。我也有两个子类GraphEditor和一个TreeMapEditor. 的实现TreeMapEditor基本上包装了 aGraphEditor并且现在基本上将所有请求转发到底层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

} 

}

4

1 回答 1

1

您可能想在 GraphEditor 和其他两个之间寻找一个概念;您正在做的事情中是否有一个可以由扩展 GraphEditor 但不是功能齐全的 GraphEditor 或 TreeMapEditor 的类表示的构造?如果有,公共代码可能会包含在其中。

但是我会小心地继续在您的问题空间中实现某些东西的表示,而不是仅仅将方法放入继承层次结构中的类中,因为那是您需要它们的地方。这种自下而上的创建类的风格可能会导致糟糕的设计,很难理解,直到有人说“哦,他只是希望这个方法在这里可用。”。

于 2013-03-11T16:38:30.857 回答