2013-02-17 50 views
2

我要聲明的接口是使用與幾類
此類有方法用不同的參數
與不同方法的接口參數

接口:

public interface Operation { 

public int Add(); 

} 

A類:

public class CLASSA implement Operation{ 

    public int Add(int id,String name); 

} 

B類:

public class CLASSB implement Operation{ 

    public int Add(String name); 

} 

如何推動這個接口?

+9

如果他們有不同的參數,那麼他們沒有使用相同的接口! – 2013-02-17 13:39:57

+0

我不認爲有這個問題的一個合適的答案爲是沒有接口的使用權。但是,如果您提供信息,爲什麼要這樣做,可能有另一種方法來解決您的問題。 – Zhedar 2013-02-17 13:47:40

+0

就目前而言,這無法以合理的方式回答。請描述爲什麼**你需要這樣做(即你打算如何使用這個假設的接口)。 – 2013-02-17 14:01:16

回答

7

你可以把操作數對象

public interface Operation { 

public int Add(Operand o); 

} 

public interface Operation { 

public int Add(Operand... o); 

} 
+1

這是如何解決問題的? – Zhedar 2013-02-17 13:42:15

+0

現在你可以使用這個接口 並模擬不同的參數 沒有其他方式來做到這一點,因爲否則,你將需要不同的接口 – cIph3r 2013-02-17 13:43:42

+1

這提供了靈活性,但需要額外的類型檢查,但這可能是一些必要的權衡所以這是一個有用的解決方案。這也意味着你可以在操作數的子類中進行操作,並在該接口的實現中爲該子類添加邏輯,從而允許傳遞任何類型的參數。但是請注意,如果這個名稱確實是該類的名稱,那麼'Operands'應該讀取'Operand'。 – 2013-02-17 13:52:55

0

你不能做這樣的。如果界面操作是你的(不是預定義的或者其他人),那麼在其中就有重載的抽象方法。這是唯一的方法。

0

最好嘗試一下:

public interface Operation { 
    public int add(); 
} 


public class SimpleOperation implements Operation { 

    @Override 
    public int add() { 
     return 0; 
    } 

    public int add(int id, String name) { 
     return id; 
    } 

} 

在使用時:

Operation op = new SimpleOperation(); 
op.add(); // Valid 
op.add(2, "two"); // Invalid 

基本上,雖然你也可以添加方法到類,如果它不存在中那麼如果你調用它的實例是該接口的話,你就不能調用它。

這是有效的,但是由於該實例SimpleOperation類,其具有重載方法聲明的:然而

SimpleOperation op = new SimpleOperation(); 
op.add(); // Valid 
op.add(2, "two"); // Also valid 

這減少的接口的有效性。如果你熱衷於重載方法,可以考慮使用一個抽象超類,並定義這兩個方法並在你的子類中重寫它們。或者,將原始方法和重載方法都添加到界面中。

在你沒有使用相同的接口這種情況下
+0

但現在,你的界面我們也沒用,因爲 添加(INT,字符串)不在這裏定義... 也,Java的慣例告訴我們使用小寫的方法名加() – cIph3r 2013-02-17 13:47:27

+2

這是如何解決問題的? – 2013-02-17 13:47:39

+0

@ cIph3r你是完全正確的,沒有注意到。 OP也不應該在班級名稱上使用全限額。 – 2013-02-17 13:50:34

1

,但你可以創建一個世襲制度中的一些參數自動插入:

public class CLASSA{ 
    public int Add(int id,String name){ 
     //something 
    } 
} 

public class CLASSB extends CLASSA{ 
    public int Add(String name){ 
     super.Add(this.FIXED_ID, name); 
     //something 
    } 
} 

public class OPERATION extends CLASSA{ 
    public int Add(){ 
     super.Add(this.FIXED_ID, this.FIXED_NAME); 
     //something 
    } 
} 
+0

但是請注意,在子類中添加額外的細節通常會更好,並且不會將它們帶走,因爲任何修改都會導致所需的維護工作量減少。 – 2013-02-17 13:58:23

0

這是一個壞主意,它違反了面向對象的設計和想法在界面後面。應該使用一個接口來抽象出實現中的方法調用。

我的建議是在接口中使用帶有兩個參數的方法,並且不要在CLASSB中使用ID參數,也不要在接口中使用ID方法,並且每個類中只有不同的版本。

0

兩種解決方案
無論是定義在該接口兩種方法:

public interface Operation { 

public int addName(String name); 
public int addIdName(int id, String name); 

} 

或使用通用放慢參數

public interface Operation { 

    public int add(HashMap<String,String> keyValueParams); 
} 

但對於操作這應該工作不同。