2008-10-15 50 views
2

讓我們有下面的類層次結構:是否有可能在Java中的派生類中實現接口?

public class ParentClass implements SomeInterface { 
} 

public class ChildClass extends ParentClass { 
} 

然後讓我們這兩個實例:

ParentClass parent; 
ChildClass child; 

然後我們有以下TRUE語句

(parent instanceof SomeInterface) == true 
(child instanceof SomeInterface) == true 

是否有可能unimplement的ChildClass中的SomeInterface,所以當我們檢查instanceof運算符時它返回false?

如果不行,是否有解決方法?

回答

18

不,這是不可能的,你的意圖是一個很好的暗示,你的類層次結構中存在某些缺陷。

解決方法:更改類層次結構,例如。像這樣:

interface SomeInterface {} 
abstract class AbstractParentClass {} 
class ParentClass extends AbstractParentClass implements SomeInterface {} 
class ChildClass extends AbstractParentClass {} 
2

這是不可能的,這樣做會違反ChildClass和ParentClass之間隱含的IS-A關係。你爲什麼想這樣做?

-1

也許你有一個可以設計出更好的解決方案的具體案例,但對於通用案例,你需要一些黑魔法。最終Javassist可以用來「破解」你的對象,但我不太確定。

2

我不認爲你可以「實現」它,但你可以檢查它是否是父類的一個實例。你的界面是?如果是這樣,你可以擴展它來包含一個帶有語義的「IsObjectDerived」方法,如果這個類只從對象派生出來,它將返回true。既然你正在寫這個類,你所需要做的就是在父類中實現它,並且如果對象是Parent類,則返回true,否則返回false。

你也可以通過檢查當前類的超類並確保它是對象來做到這一點。我可能會這樣做,因爲實現類不能說謊。你可能想看看我發現的Java反射tutorial

[編輯]一般來說,我認爲這似乎在一個合理的設計是不必要的,但它可以做到。

0

我認爲你應該把這個問題作爲你的界面和類設計有缺陷的明確指示。即使你可以用Java來做(而且我認爲你不能),你也不應該這樣做。

如何重新分解ParentClass,以便您將SomeInterface實現與ChildClass中需要的實現分開。也許你需要一個用於ParentClass和ChildClass的公共基類。

7

也許組成,而不是繼承的是你想要的,即有一個「基礎類」的對象爲成員,並只實現你所需要的接口,轉發需要對成員的任何方法。

0

我看不出這是怎麼回事,但你可能動態地改變一個類使用由Shigeru Chiba等人創建的優秀包Javassist。使用這種方法,您可以添加和刪除類中的特徵,然後使用這些類的實例而不保存爲類文件。

動態,有趣和完全混淆的任何人。謹慎使用是我的建議,但請充分利用它,因爲在我看來,它使您成爲更好的程序員。 (我相信ASM以類似的方式工作,但到目前爲止我還沒有嘗試過,它似乎在JVM上工作的非Java語言創建者中非常流行,所以它可能是很好的。)

3

我同意其他答案,這是不可能在Java中。

其他答案進一步表明它顯示了你的設計中的缺陷。

雖然我同意他們的觀點,這是唯一公平地指出,一些著名的專家OO(特別是伯特蘭·邁耶)我們不同意,並相信這樣的設計應該被允許。

其他OO遺傳模型(值得注意的是,邁耶的艾菲爾編程語言)都支持你正在尋找(CAT)功能「可用性或類型的變化」。

1

由於繼承,多態OOP的基礎上,表示是-A的關係 - 你的問題似乎要求的方式來重新定義「是」的關係是「不」的關係。

這是行不通的。

回到一些介紹面向對象的文本或在線資料和研究什麼的面向對象的方法:多態,封裝和身份。

  1. 剝離身份,你有COM/ActiveX和被盜的憑據。
  2. 剝離封裝,沒有人是安全的。
  3. 剝去多義主義的類型規則,你基本上什麼都不是,它說的是什麼。

如果你想這樣的情況,那麼在「C」計劃。不要混淆假裝使用OOP語言功能編寫OOP代碼。只需使用結構來保存你的數據。把工會放在任何地方。放棄使用類型轉換。

你的計劃有可能將無法可靠地工作,但您將能夠規避任何限制的語言如Java和C++都推出使程序更可靠,更易於閱讀,並更容易編寫/修改。

在動態編程語言如SmalTalk或Python,你基本上可以翻錄展翅騰飛在運行時的蝴蝶。但只能通過改變/破壞對象的類型。

這樣做不會爲你買東西。有代碼/設計技術和設計模式可以讓你實現任何「好」的結果,你可能會在這之後得到類似的結果。

,如果你認爲的正是你試圖在你的應用程序做的,然後試圖找到實現最安全/最簡單的方法是最好的,使用聲技術。

相關問題