我目前是一名学习Java的学生,并没有学习任何OO设计原则。我想修改现有的类组:MathEditor,OCREditor,DataEditor,ParameterEditor。
我掌握了继承等等。但是,这些类中的每一个都继承了不同的父级。例如,MathEditor继承Math类,OCREditor继承OCR类。我想为所有四个类添加一个名为changeName
的方法。 changeName
中的代码完全相同。我应该创建一个接口并使这四个类实现吗?或者我应该复制/粘贴changeName
并手动将其添加到每个班级(我觉得这不好)。
我很困惑,我不想过多地修改代码并创建太多的类,因为我正在修改现有的代码库。
答案 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())
你需要研究一下代码