11

可能重复:
向接口添加额外的方法

我有一个场景,Interface X已经用我的数千个课程实现了。现在我想在其中添加新方法Interface X。那么如何以最小的方式进行更改以解决我所有类中方法被覆盖的问题

4

3 回答 3

15

我只会为需要其他方法的类创建接口的扩展......

public interface BaseInterface {
    public int exampleMethod();
}

public interface ExtendedInterface extends BaseInterface {
    public int anotherMethod();
}

数以千计的类已经实现BaseInterface。对于需要额外方法的类,您将它们更改为 implementation ExtendedInterface

如果您的对象存储在诸如BaseInterface[]数组之类的集合中,这仍然有效,因为 typeExtendedInterface的对象也是 type 的对象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
}

这可能适合也可能不适合,具体取决于您的使用情况。

如果您确实需要所有数千个对象来实现新方法,则必须将该方法添加到 IDE 中BaseInterface,然后使用 IDE 或文本编辑器的功能在所有类中实现该方法。例如,您可以在文本编辑器中将它们全部打开并执行查找替换以查找每个类共有的内容,并将其替换为通用代码 + 新方法的默认代码。相当快速和无痛。我敢肯定,某些​​ IDE 可能还会自动将方法声明添加到所有继承类,或者至少可以在右键菜单中执行此操作。

于 2012-06-17T06:05:22.640 回答
3

如果新方法是接口的真正扩展,那么正确的做法是编辑接口并使用开发环境的工具找到必须实现新功能的所有位置。然后做作业。Eclipse 和 Netbeans 会做得很好。

[NB 我有点惊讶重构工具没有处理一些手动工作,但确实如此。]

如果在旧代码中大部分时间都不会调用新方法,则将新接口视为旧接口的扩展:

public interface NewInterface extends OldInterface {
    void newMethod();
}

如果您需要将旧接口对象传递给具有 null 版本的新接口使用者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));

这并不漂亮,但是随着年龄的增长,大型系统通常会像这样长出粗糙的边缘。

于 2012-06-17T06:16:07.467 回答
1

没有简单的方法可以做到这一点。如果向接口添加方法,所有实现类都必须覆盖它。如果将接口更改为抽象类,则还必须重构实现类。

但是你有一个类层次结构对吗?因此,您可以通过仅在基类中实现该方法来最小化工作。但这取决于您的具体要求和细节,所以我想很高兴实施!

如果没有简单的类层次结构可以用来实现类似的新方法,那么也许是时候考虑进行重大重写以减少未来的维护工作量了。

于 2012-06-17T05:35:13.203 回答