0

これが問題です。私は 1 つの抽象基本クラスを持っていEditorます。また、2 つのサブクラスGraphEditorTreeMapEditor. の実装はTreeMapEditor基本的に a をラップし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

} 

}

4

1 に答える 1

1

GraphEditor と他の 2 つの間の概念を探したいと思うかもしれません。GraphEditor を拡張するが、完全な機能を備えた GraphEditor または TreeMapEditor ではないクラスによって表すことができる、あなたがしていることの中に構成要素はありますか? ある場合は、共通のコードが入る可能性があります。

しかし、継承階層内のクラスにメソッドを配置するだけでなく、問題空間に何かの表現を実装し続けるように注意します。なぜなら、それが必要だからです。クラスを作成するこのボトムアップ スタイルは、設計が不十分になる可能性があり、誰かが「ああ、彼はこのメソッドをここで利用できるようにしたかっただけだ」と言うまで理解するのが困難です。

于 2013-03-11T16:38:30.857 に答える