2014-04-17 73 views
0

是否有一個用例,我們需要一個沒有定義方法的抽象類?我碰巧爲了泛型而創建了這樣一個抽象類,以便用戶只傳遞這個類的子類型。但我想知道是否有效或有更好的方法來做到這一點。沒有方法的抽象類

+0

嘗試什麼?我知道我們可以做到這一點。我在問是否有用例 –

+1

@KugathasanAbimaran:因爲可能存在隱藏的陷阱,這就是他在這裏問的原因。 – RichieHindle

+0

聽起來像是我的一個接口.... –

回答

5

擁有一個沒有方法的抽象類是合法的,但完全沒有意義。您可以使用抽象類共享實現。如果一個類沒有方法,它沒有實現分享。

如果你需要有一些共同的變量(我假設你的抽象類至少有一些字段,否則它完全是空的),你將與成分和界面更好,就像這樣:

class CommonData { 
    // Some getters and setters for items that you wish to share 
} 
interface WithCommonData { 
    CommonData getCommonData(); 
} 

您的類可以將常用數據作爲成員,並實現接口WithCommonData,使您可以訪問常用數據,並讓這些類保持其繼承結構。

如果你需要「標記」一個用戶類,使用「標記接口」(即沒有方法的接口)來做這件事更加靈活,因爲用戶有能力建立自己的繼承鏈。

+0

我不明白爲什麼組合比繼承共享變量更適合。你願意解釋一下嗎? – Joffrey

+1

根據你的文章更新,我認爲IYO更好,因爲你可以自由地繼承其他東西,即使有這個共享數據,對吧?在這種情況下,IMO取決於類的語義。如果繼承層次對於由類表示的現實世界有意義,我會繼承。 – Joffrey

+1

@Joffrey當你需要別人在他們的類中共享數據時,而不是建立自己的繼承層次結構會更好。當層次結構是你的時候,通過繼承進行共享更容易。當層次結構是某人elses'(我認爲是OP的情況,因爲他寫道「用戶將只傳遞子類型」),他們可能有自己的基類,他們從中繼承,所以它可能無法繼承類也是如此。 – dasblinkenlight

1

僅僅因爲其他類應該是這種類型而不需要創建一個抽象類。這可以通過使用接口來實現。 由於類只能擴展一個類,但實現任意數量的接口,因此使用接口作爲實例驗證程序不會限制繼承方面的解決方案。

例子:

public interface Vehicle { 
    // No methods, we just want several classes to be identified as of type Vehicle 
} 


public class Car implements Vehicle { 
    // is a vehicle 
} 

public class Motorcycle implements Vehicle { 
    // is a vehicle 
} 

public class Banana { 
    // is not a vehicle 
} 

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

     Object o = new Car(); 
     if(o instanceof Vehicle) { 
      // Ok 
     } 

     Object p = new Banana(); 
     if(p instanceof Vehicle) { 
      // Will never get here 
     } 
    } 
}