2012-12-11 58 views
2

我有這個問題很長一段時間,但所有回答我的人沒有給我一個正確的答案。我認爲,接口在OOP語言用於多態性與情況類似下面,我不知道如何處理它, [在Java]如何在OOP語言中正確使用界面

讓我們下面的接口和兩個類,

public interface Vehicle{ 
    public int noOfWheels(); 
    public String movingMethod(); 
} 

public class Car implements Vehicle{ 
    public int noOfWheels(){ 
      return 4; 
    } 

    public String movingMethod(){ 
     return "Drive"; 
    } 
} 

public class Flight implements Vehicle{ 

    public int noOfWheels(){ 
     return 5; 
    } 

    public String movingMethod(){ 
     return "Fly"; 
    } 

    //a behaviour only applicable to a flight 
    public int noOfWings(){ 
     return 5; 
    } 
} 


======================================= 
simulation 

    Vehicle v1 = new Car(); 
    System.out.println(v1.noOfWheels()); 
    System.out.println(v1.movingMethod); 

    Vehicle v2 = new Flight(); 
    System.out.println(v2.noOfWheels()); 
    System.out.println(v2.movingMethod); 
    System.out.println(v2.noOfWings());//this is not working as Vehicle interface doesn't have this method. 

那麼,我們如何才能爲這類問題實現解決方案。我知道我們可以爲航班類型創建另一個界面,但我使用這個例子來表達我的問題。

+2

您可以使用'instanceof'運算符來檢查'v2'的類型並將其轉換爲具體類型'Flight'。然後你可以直接使用'Flight'的方法。 – hoaz

+0

調用noOfWings()方法會給出錯誤,因爲它並未在Vehicle接口中聲明,並且僅適用於Flight沒有將該方法放入Vehicle接口中的情況。我需要使用所有車輛類型作爲車對象使用。我知道這是不可能的。有沒有合適的模式來實現這一點。 – Harsha

+0

5是一個有趣的翅膀順便說一句。 –

回答

2

我不是100%的問題是什麼,但似乎你問你如何表達額外的行爲,以基本界面。這是值得了解的接口可以擴展另一個接口:

public interface Aircraft extends Vehicle { 

    public int noOfWings(); 
} 

實現Aircraft需要落實Vehicle以及noOfWings聲明的方法的類。

1

我想在你的VehiclenoOfWings方法也可以被定義爲車輛能夠具有護翼,以及(如飛行)(或者你可以擴展Vehicle創建另一個接口)

接口用於多態性,但在你的例子在邏輯上也沒有翅膀的多態性。你只是在Flight類中定義它,使它成爲更加專業化的翅膀。

0

在你的例子中,v2Vehicle,編譯器只允許從這個接口調用方法。看起來你明白這一點。如果你想調用實現類的方法,你需要執行一次演員。

這樣說,我很想知道你是否在真正的程序中遇到過這個問題?如果是這樣,你能描述一下你遇到了什麼,以及爲什麼用這種方式使用接口是一個問題?

+0

實際上這個問題並沒有在真正的程序中提出。我有這個問題,因爲我在我的課上學到了一些關於OOP語言的接口。 – Harsha