簡體   English   中英

使用Java泛型來擴展接口還是設計不好?

[英]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();

至少這是我現在可以想到的,但是在實現這一點上沒有任何成功。

非常感謝!


編輯1

對不起,我的解釋不好。

層次結構不是上下顛倒的(最基礎是基礎)。

SSODecoder是我的問題。 我知道它可能需要XMLDecoderHTTPDecoder 忘了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擴展了SSOBindingSSOBinding擴展了SSODecoderSSODecoder擴展了XMLDecoderHTTPDecoder那么如果兩個對象分別實現SSOBindingAssertion ,則*兩者都將實現XMLDecoderHTTPDecoder每個方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM