再次覆盖与重载

时间:2013-03-08 09:23:48

标签: java interface

考虑以下Java interface

public interface Script<T> {
    public T execute(Map<String,Object> args); 
}

然后我们有一个

public interface SubScript<T> extends Script<T> {
    public T execute(String knownTypeArgument, Map<String,Object> args);
}

在Sub中,knownTypeArgument方法始终需要execute。在SubScript界面中,不需要方法public T execute(Map<String,Object> args);

我的问题是,为了添加一个或两个参数来定义子接口是标准/正确的做法吗?

在实施中会导致代码错误如果SubScript完全没有定义且knownTypeArgument传递给Map<String,Object> args

PS: execute(String knownTypeArgument, Map<String,Object> args);execute(Map<String,Object> args);都应该用于完全相同的目的,只是在某些情况下execute需要更多信息。

PPS: 根据stackoverflow规则,我正在寻找我缺少的事实/点,而不是讨论。

3 个答案:

答案 0 :(得分:2)

即使你写了

  

SubScript界面中,不需要方法public T execute(Map<String,Object> args);

这并不意味着execute(Map<String, Object) args)会在SubScript中消失。该界面将具有两种方法。它们可能具有相同的名称,但由于它们的签名不同,因此它们不会相互干扰。

SubScript的每个实现都必须实现两种方法。当然,其中一种方法可以调用另一种,但这不是强制性的。

答案 1 :(得分:1)

在您的情况下,任何实现SubScript的类都需要实现

public T execute(Map<String,Object> args);

public T execute(String knownTypeArgument, Map<String,Object> args);

作为两个独立的重载方法,所以上面的方法并不适合您的需求。

也许创建一个类来执行你的方法设计要做的事情,使用不带参数的execute()方法,以及设置任何所需参数的setter方法。

答案 2 :(得分:-1)

接口应该用于定义给定行为所需的方法,因此通常以“able”后缀结束,如可拖动或可自定义。

对于仅创建辅助接口以添加新方法签名,建议使用方法重载。 Java允许多个方法共存同名但不同的参数集。您可以轻松地将两种方法都驻留在同一个类/接口中,并根据需要调用它们。