2014-10-02 45 views
1

试图说抽象: 我尝试为组件和定向连接器的网络设计通用模式。所有提供者都通过连接器连接。 因此,没有损失一般性的,想象组件和连接链(简单网络),我们有这样的事情: COMPA - > ConnectorAB - > CompB的 - > ConnectorBC - > compc命令......等等Cyclomatic泛型代码设计

由于连接器应该是具有某些属性和功能的实际对象,因此我不能仅仅实现类似双链列表的备件。

组件将列表中的输入和输出连接器保存在一个列表中,并且连接器保存其源和目标组件。 我给你我的一个实例运行:

interface Component<In extends Connector, Out extends Connector> { List<In> getIns();...} 

interface Connector<S extends Component, T extends Component> { S getSource();...} 

interface CompA<In extends Connector<?, CompA>, Out extends Connector<CompA, ?>> extends Component<In, Out> {} 

interface CompB<In extends Connector<?, CompB>, Out extends Connector<CompB, ?>> extends Component<In, Out> {} 

interface A_A extends Connector<CompA, CompA> {} 

interface A_B extends Connector<CompA, CompB> {} 

问题:

  • 我)圈通用depedencies:我可以巢泛型无限(Component<Connector<Component.......>>>),而不是我使用原始类型,这是罚款,但无论如何它似乎是混乱的。
  • ii。)我想用CompA<In extends Connector<?, CompA>, Out extends Connector<CompA, ?>>表达的是,我的CompA知道它已连接到针对CompA的连接器。显然这不是我在语法上做的事。 。
  • III) A_A aa; aa.getSource(); //gives me a CompA, thats great. aa.getSource().getIns(); //gives me a List of raw Connectors, but i would like to have a list of partially defined connectors, they know they are referencing a compA aa.getSource().getIns().get(0).getTarget() // should give me a compA 写我的代码,因为它是,很明显,这并不工作,因为我想它,但是我认为'aa.getSource()getIns();'可以工作作为对在-Type至少是一个连接器的权利?
  • 我在寻求建议来实现这个模式(所以说,纠正我的代码!)。它必须在java中,但我不必只使用java泛型。如果你可以使用非java通用模式来完成这个抽象模式,它可能会很好(基于其他Java语言特性或OO模式的模式)。

    我想我错过了很多信息,所以如果有些事情不清楚,请询问。

    回答

    3

    我认为以下将最好地模拟您的要求。您可能仍会遇到一些差异和/或删除问题。如果你这样做,我会建议你完全放弃泛型而不是诉诸于原始类型。

    interface Component<SELF extends Component<SELF>> { Set<Connector<?, SELF>> getIns();...} 
    
    interface Connector<SOURCE extends Component<SOURCE>, DESTINATION extends Component<DESTINATION>> { SOURCE getSource();...} 
    
    interface CompA extends Component<CompA> {} 
    
    interface CompB extends Component<CompB> {} 
    
    interface A_A extends Connector<CompA, CompA> {} 
    
    interface A_B extends Connector<CompA, CompB> {} 
    
    +0

    +1,这正是我以前想到的:) – sp00m 2014-10-02 10:12:29

    +0

    我必须在判断之前实施一点,但它是完美的!非常感谢你,我可以问你,你是怎么想出来的?它是否立即出现在您的脑海中?或者它实际上是一种已经在任何地方使用过的模式? – user2504380 2014-10-02 12:35:59

    +0

    @ user2504380自我类型模式('Foo >',也被称为F-有界量化)是一种相当常见的模式。一旦你有了,剩下的就落在原地。所以,是的,当我阅读你的要求时,解决方案立刻就出现在我的脑海里。但现在你知道自我类型的模式,它也会对你的。 ;) – 2014-10-02 17:32:16