0

考虑以下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 规则,我正在寻找我遗漏的事实/要点,而不是讨论。

4

3 回答 3

2

即使你写

并且在SubScript接口中public T execute(Map<String,Object> args);不需要该方法。

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

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

于 2013-03-08T09:28:09.923 回答
1

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

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

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

作为两个单独的重载方法,因此上述模式不是您需要的好模式。

也许创建一个类来执行您的方法的设计目的,使用不带参数的 execute() 方法和设置任何所需参数的 setter 方法。

于 2013-03-08T09:29:59.113 回答
-1

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

至于创建辅助接口只是为了添加新的方法签名,建议使用方法重载。Java 允许多个具有相同名称但参数集不同的方法共存。您可以轻松地将两种方法驻留在同一个类/接口中,并调用适合需要的方法。

于 2013-03-08T09:31:45.887 回答