2011-05-06 60 views
2

我正在用java編程。 假設我有一個「MyInterface」接口和一個「MyClass」抽象類。只能在類繼承自特定類時才能實現接口

我想確保實現「MyInterface」接口的每個類都從「MyClass」繼承。 MyClass的繼承類完全無法實現「MyInterface」接口。

這可能嗎?謝謝。 對不起,如果我的英語不好,但我是法國人。

回答

1

AFAIK,你不能直接這樣做。

泛型讓你說這樣的事情,如果它可以幫助:

public <T extends MyClass & MyInterface> void foo(T param) { /**/ } 

所以,你只能調用與都MyClass的和MyInterface的參數FOO()。

或者,爲什麼不有兩個抽象基類?

abstract class MyClass { /* stuff here */ } 
abstract class MyInterfaceClass extends MyClass { /* empty */ } 

然後,使用MyInterfaceClass而不是MyInterface。

或者,如果你只關心容器,自己寫:

static class MyList extends ArrayList<MyInterface> { 
    @Deprecated 
    public boolean add(MyInterface obj) { 
     assert obj instanceof MyClass; 
     return super.add(obj); 
    } 

    public <T extends MyClass & MyInterface> boolean add(T obj) { 
     return super.add(obj); 
    } 
} 

然後,你會得到一個棄用警告你犯了一個錯誤的任何時間。

但我的問題仍然存在 - 你想解決什麼問題?你可以使用更多的描述性名稱而不是「Class」和「Interface」?也許是正確的解決方案是我想擁有的MyClass不同的子類完全不同的東西..

+0

。其中一些可存儲在列表中,其中一些不是。 – Klems 2011-05-06 18:39:13

+0

此外,有一個實現MyInterface並且不能從MyClass繼承的類可能會導致錯誤。我想在設計我的課程時避免愚蠢的錯誤。 – Klems 2011-05-06 18:40:57

+0

我正在創建一個視頻遊戲,其中有實體(實體類)。其中一些具有真實的位置(Spatial類),其中一些具有整數位置(Tiled類),其中一些根本沒有位置(邏輯類)。任何實體都可以更新(可更新界面)或渲染(可繪製界面)。任何空間也可以被其他實體可見(可見接口)。具有可見邏輯是愚蠢的,就像擁有一個實現可更新的類並且不是從實體繼承的類。如果我創建一個從B繼承的新實體,我不必編寫B已經實現的接口。 – Klems 2011-05-06 19:23:16

2

我想確保每類 實施「MyInterface的」 接口從「MyClass的」繼承。

沒有。這是不可能的。接口的重點在於使得來自不同繼承層次結構的類可以實現對預定義功能集的支持。

0

不,這是不可能的。任何課程都可以實施MyInterface。沒有辦法將執行者限制爲MyClass的子類。

如果你真的需要這樣的我想你會具有不使用的接口,而是在地方的接口使用MyClass被卡住的限制。

相關問題