我有Interface X
的情况,已经用我的数千个课程实现了。现在我想在Interface X
中添加新方法。那么如何以最小的方式进行更改以解决所有类中方法被覆盖的问题
答案 0 :(得分:12)
我会为只需要其他方法的类创建一个接口扩展...
public interface BaseInterface {
public int exampleMethod();
}
public interface ExtendedInterface extends BaseInterface {
public int anotherMethod();
}
数以千计的课程已经实施BaseInterface
。对于需要额外方法的类,您可以更改它们以实现ExtendedInterface
。
如果您的对象存储在诸如BaseInterface[]
数组之类的集合中,这仍然有效,因为ExtendedInterface
类型的对象也是BaseInterface
类型的对象,因此它们仍然可以存储在同一个共同的集合中。
例如,这仍然是完全有效的......
BaseInterface[] objects = new BaseInterface[2];
objects[0] = new ClassThatImplementsBaseInterface();
objects[1] = new ClassThatImplementsExtendedInterface();
但是,如果您需要访问ExtendedInterface
的新方法,但该对象存储在BaseInterface
集合中,则需要先将其转换为ExtendedInterface
你可以用它......
BaseInterface[] objects = new BaseInterface[1];
objects[0] = new ClassThatImplementsExtendedInterface();
if (objects[0] instanceof ExtendedInterface){
// it is an ExtendedInterface, so we can call the method after we cast it
((ExtendedInterface)objects[0]).anotherMethod();
}
else {
// it is a BaseInterface, and not an ExtendedInterface
}
根据您的使用情况,这可能适用也可能不适用。
如果您确实需要所有数千个对象来实现新方法,则必须将方法添加到BaseInterface
,然后使用IDE或文本编辑器的功能来实现所有方法你的课程。例如,您可以在文本编辑器中打开它们,然后执行查找替换查找每个类共有的内容,并使用公共代码替换它新方法的默认代码。非常快速,无痛。我确信某些IDE可能还会自动将方法声明添加到所有继承类,或者至少可以选择在右键单击菜单中执行此操作。
答案 1 :(得分:3)
如果新方法是接口的真正扩展,那么正确的做法是编辑接口并使用开发环境的工具来查找必须实现新功能的所有位置。然后做好工作。 Eclipse和Netbeans会做得很好。
[NB我有点惊讶的是,重构工具不会处理一些手动操作,但它确实如此。]
如果在旧代码中大部分时间都不会调用新方法,请将新接口视为旧接口的扩展:
public interface NewInterface extends OldInterface {
void newMethod();
}
如果您需要将旧接口对象传递给具有空版本newMethod()
的新接口使用者,则可以执行以下操作:
public class NewInterfaceWrapper<T extends OldInterface> implements NewInterface {
private T wrapped;
public NewInterfaceWrapper(T wrapped) {
this.wrapped = wrapped;
}
// Define all the old interface methods and delegate to wrapped.method
// Now provide the null implementation of new method.
void newMethod() { }
}
...
wantsNewInterface(new NewInterfaceWrapper(oldImplementer));
它并不漂亮,但是随着年龄的增长,大型系统通常会像这样生长粗糙的边缘。
答案 2 :(得分:1)
没有简单的方法可以做到这一点。如果向接口添加方法,则所有实现类都必须覆盖它。如果将接口更改为抽象类,则还必须重构实现类。
但是你有一个类层次结构吗?因此,您可以通过仅在基类中实现该方法来最小化工作。但这取决于您的具体要求和细节,所以我想快乐实施!
如果没有简单的类层次结构可用于实现这样的新方法,那么您可能需要考虑进行重大改写以支持将来的维护工作量减少。