如何停止为Java中的不同类创建相同的方法

时间:2014-07-13 02:06:08

标签: java oop

我目前是一名学习Java的学生,并没有学习任何OO设计原则。我想修改现有的类组:MathEditor,OCREditor,DataEditor,ParameterEditor。

我掌握了继承等等。但是,这些类中的每一个都继承了不同的父级。例如,MathEditor继承Math类,OCREditor继承OCR类。我想为所有四个类添加一个名为changeName的方法。 changeName中的代码完全相同。我应该创建一个接口并使这四个类实现吗?或者我应该复制/粘贴changeName并手动将其添加到每个班级(我觉得这不好)。

我很困惑,我不想过多地修改代码并创建太多的类,因为我正在修改现有的代码库。

4 个答案:

答案 0 :(得分:2)

如果您不能让它们从同一个父级继承,则按组合进行增强。创建一个类,可能称为具有changeName方法的EditorAssistant,让您的类继承同样具有changeName方法的接口,并将助手的方法作为委托调用。

例如:

interface Editable {
   void changeName(String name);

   String getName();
}

class EditorAssistant implements Editable {
   private String name = "";

   @Override
   public void changeName(String name) {
      this.name = name;
   }

   @Override
   public String getName() {
      return name;
   }
}

class SomethingEditor implements Editable {
   private EditorAssistant assistant = new EditorAssistant();

   @Override
   public void changeName(String name) {
      assistant.changeName(name);
   }

   @Override
   public String getName() {
      return assistant.getName();
   }
}

class SomeOtherEditor implements Editable {
   private EditorAssistant assistant = new EditorAssistant();

   @Override
   public void changeName(String name) {
      assistant.changeName(name);
   }

   @Override
   public String getName() {
      return assistant.getName();
   }
}

不可否认,这是一个微不足道的例子,但它可以很好地扩展。

答案 1 :(得分:2)

我认为你对遗传的控制很脆弱,对构图没有任何线索。

这是面向对象的新手,他们倾向于过度使用继承。应该教他们更喜欢作文。

我认为那里有一个共同的编辑器界面。这些类中的每一个都可以有一个Editor实例,如下所示:

public interface Editor {
    void changeName(String newName); 
}

public class EditorImpl implements Editor {
    private String name;

    public void changeName(String newName) { this.name = newName; }
}

public MathEditor extends Math {
    // composition: MathEditor HAS-A Editor reference
    private Editor editor; 

    public MathEditor(Editor editor) { this.editor = editor; }
}

答案 2 :(得分:1)

您可以向所有当前父类添加单个顶级父级。将方法添加到新添加的祖父母。

答案 3 :(得分:1)

接口号您需要四次实施该方法,并且编辑起来非常困难。但是,如果您以Java 8为目标,则可以使用该方法和默认实现创建一个接口。而且,即使使用接口,接口也需要一个逻辑...你为一个方法创建一个接口,它可以更好地适应当前的方案?

无论如何,在去上课并让它们延伸之前等等。

类名感觉它们都扩展了一个Editor类,你能查一下吗?也许MathEditor扩展了Math,它扩展了Editor(对于其他人来说也是如此),在这种情况下,您可以编辑Editor类并将该方法放在那里。

如果没有,我认为创建一个通用的编辑器类是一个很好的抽象,他们应该实现所有方法,使其成为优秀的编辑器(如:save(),delete())

你需要研究一下代码