[英]using java generics to extend interfaces or just bad design?
我還是Java世界的新手(前C ++程序員)。 我設計了一個接口層次結構,以強制實現@Override接口中的方法。 現在,我處於某種“如何在Java中做到這一點”的問題。 所有的波紋管都是接口。
XMLDecoder HTTPDecoder
| |
------------------
|
SSODecoder UserStuff
| |
-----------------------------
|
|
SSOBinding
|
|
Assertion
現在有趣的部分是我有一個實現SSOBinding的對象和另一個實現Assertion的對象。 我的問題是既要實現的XMLDecoder 和 HTTPDecoder每一個方法。 我相信我有一些漂亮的設計,但為此:(
Java泛型可以幫助我解決此問題嗎? 就像是:
Assertion<XMLDecoder> anAssertion = new Assertion<XMLDecoder>();
anAssertion.OnlyMethodsInXMLDecoder();
至少這是我現在可以想到的,但是在實現這一點上沒有任何成功。
非常感謝!
對不起,我的解釋不好。
層次結構不是上下顛倒的(最基礎是基礎)。
SSODecoder是我的問題。 我知道它可能需要XMLDecoder或HTTPDecoder 。 忘了SSOBinding。 所以我可以有一個實現:
class AssertionImpl1 implements Assertion {
// Only implementing XMLDecoder
}
class AssertionImpl2 implements Assertion {
// Only implementing HTTPDecoder
}
這些的唯一區別將是它們需要為解碼器實現的方法。
簡短答案:不可以。
我猜測您的繼承樹錯了:如果不是SSODecoder的所有實例都需要在HTTPDecoder和XMLDecoder中實現方法,則SSODecoder不是兩者的子接口。
您應該研究一種替代設計,其中HTTPDecoder和XMLDecoder是SSODecoder使用的策略。 強制它們具有相同的接口,並使SSODecoder委托給它們...無論他們承擔什么責任。
這樣,您的呼叫將類似於:
Assertion anAssertion=new Assertion(new XMLDecoder());
我不確定您的“擴展”關系朝哪個方向發展,但是如果Assertion
擴展了SSOBinding
, SSOBinding
擴展了SSODecoder
和SSODecoder
擴展了XMLDecoder
和HTTPDecoder
那么如果兩個對象分別實現SSOBinding
和Assertion
,則*兩者都將實現XMLDecoder
和HTTPDecoder
每個方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.