使用java泛型扩展接口或只是糟糕的设计?

时间:2011-03-17 19:58:57

标签: java generics

我还是Java世界的新手(前C ++程序员)。我设计了一个Interface层次结构来强制我的实现@Override接口中的方法。现在我在某种“如何在java中这样做”。所有下面都是接口。

XMLDecoder      HTTPDecoder
    |                |
    ------------------
            |
        SSODecoder                  UserStuff
            |                           |
            -----------------------------
                         |
                         |
                     SSOBinding
                         |
                         |
                     Assertion

现在有趣的部分是我有一个实现SSOBinding的对象和另一个实现断言的对象。我的问题是 HAVE 来实现XMLDecoder AND HTTPDecoder中的每个方法。我相信我有一些漂亮的设计,但为此:(

Java Generics可以帮我解决这个问题吗?类似的东西:

Assertion<XMLDecoder> anAssertion = new Assertion<XMLDecoder>();
anAssertion.OnlyMethodsInXMLDecoder();

至少这是我现在能想到的,但没有成功实现这一点。

非常感谢!


编辑1

很抱歉我的解释不好。

层次结构不是颠倒的(顶部是基础)。

SSODecoder是我的问题。我知道它可以要求 XMLDecoder HTTPDecoder 。忘了SSOBinding。所以我可以有一个实现:

class AssertionImpl1 implements Assertion {
       // Only implementing XMLDecoder
}

class AssertionImpl2 implements Assertion {
       // Only implementing HTTPDecoder
}

这些的唯一区别是他们需要为解码器实现的方法。

2 个答案:

答案 0 :(得分:4)

简短回答:不。

我猜你的继承树是错误的:如果并非所有SSODecoder实例都需要实现HTTPDecoder和XMLDecoder中的方法,那么SSODecoder不是两者的子接口。

您应该研究另一种设计,其中HTTPDecoder和XMLDecoder是SSODecoder使用的策略。强制他们拥有相同的界面,并让SSODecoder委托给他们......无论他们有什么责任。

这样,你的电话会是这样的:

Assertion anAssertion=new Assertion(new XMLDecoder());

答案 1 :(得分:0)

我不确定您的“扩展”关系朝哪个方向发展,但如果Assertion扩展SSOBinding,则SSOBinding扩展SSODecoderSSODecoder扩展XMLDecoderHTTPDecoder如果两个对象分别实现了SSOBindingAssertion,则*都将实现XMLDecoderHTTPDecoder中的每个方法。