2013-03-08 67 views
0

考慮以下Javainterface重載超載對比,再次

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); 
} 

這裏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:每個計算器規則 正如我在尋找事實/分,我很想念,而不是討論。

+2

您缺少的點已經在[您的上一個問題的答案]中指出(http://stackoverflow.com/questions/15270889/override-disable-super-interface-method)。 – 2013-03-08 09:31:42

回答

2

即使你寫

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

這並不意味着execute(Map<String, Object) args)將在SubScript消失。這個接口將有兩種方法。他們可能有相同的名字,但由於他們的簽名不同,他們不會互相干擾。

SubScript的每個執行都必須執行這兩個方法都是。當然,其中一種方法可以調用另一種方法,但這不是強制性的。

1

在你的情況下,任何類實現標就必須實現

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

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

爲兩個單獨的重載方法,所以上面沒有你需要的良好格局。

可能創建一個類做什麼你的方法是專門做,用execute()方法不帶參數,和setter方法來設置任何所需的參數。

-1

接口應該被用於定義所需要對於給定的行爲的方法和由此通常與「能夠」後綴結束,如在拖動或定製的。

至於創建一個輔助接口只添加一個新的方法簽名,建議使用方法重載。 Java允許具有相同名稱的多個方法共存,但是具有不同的參數集合。你可以很容易地將這兩種方法都放在同一個類/接口中,並根據需要調用。

+0

你說的是哪個建議?你從哪裏得到這個「接口應該通常以'能夠'的東西結束? – 2013-03-08 09:37:27

+0

@ arne.b [java api中接口命名的標準是什麼](http://stackoverflow.com/a/3939518/896567),java.lang.Appendable,java.lang.Cloneable,java.lang.Comparable, java.lang.Iterable,java.lang.Readable,java.lang.Runnable,java.io.Closeable,java.io.Externalizable,java.io.Serializable,...這不是絕對規則,但它是有道理的。 .. – Samy 2013-03-08 09:51:02

+0

您可能錯過了第一句中的「沒有正式約定」的部分,或者與官方命名約定的鏈接。肯定有很多接口實例,其中「可用」名稱是有意義的(通常對於那些不能涵蓋實現類的全部功能的接口),但在很多情況下它也不會(「List」 ,'Set','Observer')。 OP的類和命名方法似乎暗示了後者。 – 2013-03-08 10:16:13