2011-10-24 89 views
3

我有一個關於接口和類實現接口的問題。Java類接口類

這是我的代碼:

interface iMyInterface { 
    public iMethod1(); 
} 

public class cMyClass implements iMyInterface { 
    public iMethod1() { 
     // some code 
    } 
    protected iMethod2() { 
     // some code 
    } 
} 

我想創建,因爲這iMyInterface一個實例:

iMyInterface i = new cMyClass(); 
i.iMethod1(); 

這沒關係,但我怎麼能叫iMethod2()從我的接口實例?這是工作和安全:

((cMyClass)i).iMethod2(); 

感謝您的幫助。

回答

7

是的,這將工作(如果你改變cMyClass申報實施iMyInterface),它是安全的,只要參考真的確實指的cMyClass一個實例。

但是,這通常是一個壞主意。使用接口的全部要點是能夠與的任何實現一起工作 - 它將抽象與實現分開。如果你需要一個特定的實現,你可以使i只是cMyClass開始。

因此,假設而不是自己調用cMyClass構造,您會收到iMyInterface類型的方法參數 - 這是一個壞主意,轉換爲cMyClass在這一點上,因爲它可能是一個不同接口的實現。

(在一個單獨的說明,這是一個好主意,開始下面的Java命名約定,其中規定的類和接口應帕斯卡爾 - 裝箱 - 所以溝ci前綴)

+1

我認爲,如果他要演員,他應該用'instanceof'覈實劇組,以確保安全。 –

+0

@ S.L.Barth:無論如何,除非所需的失敗模式是ClassCastException,當然,在這種情況下,無條件轉換就可以。 –

+0

@Jon Skeet謝謝,我現在在界面中使用它,包括Method2。對不起,我忘了在我的示例中添加** implements iMyInterface **。 – TheFrancisOne

0

它將工作(前提是cMyClass實現了iMyInterface,並且您處於保護修飾符的範圍內),但這不是正確的OO處理。

如果你想使用iMethod2考慮:

  • 將它添加到界面
  • 創建一個包含方法
  • 使用另一個接口cMyClass myClass = new cMyClass();
+0

謝謝,我在我的界面中添加Method2。 – TheFrancisOne

0

有一些其他的替代投接口到一個類。這裏是例子。

interface iMyInterface { 
    void iMethod1(); 
} 

public class cMyClass implements iMyInterface { 

private iMyInterface myInterface; 

public cMyClass() { 
    myInterface = this; 
} 

public void iMethod1(){ 
    System.out.println("Print from cMyClass iMethod1()"); 
} 

protected void iMethod2() { 
    System.out.println("Print from cMyClass iMethod2()"); 
} 

/** 
* Getter so we can access to the interface methods. 
* @return 
*/ 
public iMyInterface getMyInterface() { 
    return myInterface; 
} 
} 

爲了從您的界面獲取值,下面是代碼示例。

public class Main { 
public static void main(String[] args) { 

    cMyClass myClass = new cMyClass(); 
    myClass.getMyInterface().iMethod1(); 
    myClass.iMethod2(); 
} 
} 

輸出:

從cMyClass iMethod1()從cMyClass iMethod2()

我覺得這是一個很好的例子,如何可以從類代碼分開接口代碼

列印。只需創建接口的實例,並通過具有該接口的getter使用每個方法。