有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

<>我还是java世界的新手(C++程序员)。我设计了一个接口层次结构来强制我的实现@Override接口中的方法。现在,我正在学习“如何在java中实现这一点”。所有波纹管都是接口

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

有趣的是,我有一个实现SSOBinding的对象和另一个实现断言的对象。我的问题是必须在XMLDecoderHTTPDecoder中实现每个方法。我相信我有一些漂亮的设计,但为此:(

Java泛型可以帮助我解决这个问题吗?比如:

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

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

非常感谢


编辑1

对不起,我解释得不好

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

这是我的问题。我知道它可能需要XMLDecoderHTTPDecoder。忘了你的绑定吧。所以我可以有一个实现:

class AssertionImpl1 implements Assertion {
       // Only implementing XMLDecoder
}

class AssertionImpl2 implements Assertion {
       // Only implementing HTTPDecoder
}

唯一不同的是它们需要为解码器实现的方法


共 (2) 个答案

  1. # 1 楼答案

    简短的回答是:没有

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

    您应该研究另一种设计,其中HTTPDecoder和XMLDecoder是SSO解码器使用的策略。强迫他们有相同的接口,并让他们。。。不管他们有什么责任

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

    Assertion anAssertion=new Assertion(new XMLDecoder());
    
  2. # 2 楼答案

    我不确定你的“扩展”关系朝哪个方向发展,但是如果Assertion扩展SSOBindingSSOBinding扩展SSODecoderSSODecoder扩展XMLDecoderHTTPDecoder,那么如果两个对象分别实现了SSOBindingAssertion,它们都将实现XMLDecoder和^}中的每个方法