在java中继承类重写方法时的不同参数

时间:2016-09-09 11:59:39

标签: java inheritance override

在界面中我有一个抽象方法

Server launchInstance(
           Instance instance, 
           String name, 
           Set<String> network,  
           String userData) 
     throws Exception;

现在在我的类中实现了前面的接口,我重写了这个方法,但是我不需要所有的参数,因为这会导致很多不必要的任务。在我实现的课程中,我想做类似的事情 -

@override    
Server launchInstance(Instance instance, String name) throws Exception;

如何在覆盖时从我的实现(来自Interface)类中删除一些不必要的参数?

3 个答案:

答案 0 :(得分:1)

Java无法做到这一点。

接口定义了所有实现类必须支持的方法,以便拥有统一 API。 一个目的是能够交换实现。

我看到了几个选项:

  • 使用较少的参数向接口添加第二种方法。 但是,这当然要求所有实现都支持这一点。 因此,这可能对您不适用。

  • 实现额外的第二个接口,该接口使用两个参数定义方法。

    if (x instanceof Server2)
        // short-cut: do not need to compute network and userData
        ((Server2) x).launchInstance(instance, name)
    else {
        Set<String> network = …;
        x.launchInstance(instance, name, network, userData)
    }
    
  • 只需忽略其他参数。

  • 如果您迫切需要一个统一的接口并希望避免额外参数的计算成本,请使用延迟评估(例如在T中)包装类型为Callable<T>的可选参数。如果您不需要这些值,则永远不要调用Callable。

答案 1 :(得分:1)

Interface是多个类的通用API。根据设计,您不希望接口实现更改API。

但是,您可以省略未使用的参数:

@Override
Server launchInstance(Instance instance, String name, Set<String> network,  String userData) throws Exception {
    launch(instance, name);
}

private Server launch(Instance instance, String name) throws Exception {
    ...
}

或提供Data对象:

class Data {
    private Instance instance;
    private String name;
    private Set<String> network;
    private String userData;
}

@Override
Server launchInstance(Data data) {
    ...
}

也可以使用依赖注入来简化接口(读取数据传输)。

答案 2 :(得分:0)

不,你可以打破覆盖背后的妥协......你需要为一些更抽象的东西重新设计方法签名......