我还是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();
至少这是我现在能想到的,但没有成功实现这一点。
非常感谢!
很抱歉我的解释不好。
层次结构不是颠倒的(顶部是基础)。
SSODecoder是我的问题。我知道它可以要求 XMLDecoder 或 HTTPDecoder 。忘了SSOBinding。所以我可以有一个实现:
class AssertionImpl1 implements Assertion {
// Only implementing XMLDecoder
}
class AssertionImpl2 implements Assertion {
// Only implementing HTTPDecoder
}
这些的唯一区别是他们需要为解码器实现的方法。
答案 0 :(得分:4)
简短回答:不。
我猜你的继承树是错误的:如果并非所有SSODecoder实例都需要实现HTTPDecoder和XMLDecoder中的方法,那么SSODecoder不是两者的子接口。
您应该研究另一种设计,其中HTTPDecoder和XMLDecoder是SSODecoder使用的策略。强制他们拥有相同的界面,并让SSODecoder委托给他们......无论他们有什么责任。
这样,你的电话会是这样的:
Assertion anAssertion=new Assertion(new XMLDecoder());
答案 1 :(得分:0)
我不确定您的“扩展”关系朝哪个方向发展,但如果Assertion
扩展SSOBinding
,则SSOBinding
扩展SSODecoder
并SSODecoder
扩展XMLDecoder
和HTTPDecoder
如果两个对象分别实现了SSOBinding
和Assertion
,则*都将实现XMLDecoder
和HTTPDecoder
中的每个方法。