实施遏制关系

时间:2012-12-14 15:06:30

标签: scala relationship containment

如何实现uml的强大包含关系。也称为组合。

以比例为例: 我有一个类组件,可能包含零个或多个接口:

class Component (name: String, description: String, Interaction: Set[Interface])

然后我有我的班级界面:

class Interface(name: String, description: String)

应该遵守哪些限制遏制?

  • 如果我在组件中输入接口,则此接口不能放在其他组件中。
  • 如果删除组件,还必须删除其所有界面。

还有其他限制要强制实施遏制吗?

如何实现第一个约束:

我以为我会在接口类中添加一个名为Component的signComp的字段,并在组合方法的交互上放置约束。
例如: 对于必须添加到Component的每个接口,如果接口的signComp为null,则插入接口并使用Component设置signComp,否则取消赋值。

这是一个成功的实施?或者还有其他方法。

1 个答案:

答案 0 :(得分:1)

如果你想采取一种不可改变的方法,你可以尝试这样的事情:

case class Component(name: String, description: String, interaction: Set[Interface])

case class Interface(name: String, description: String)

def addInterface(components: Set[Component], c: Component, i: Interface) =
  if(components.find(_.interaction contains i) isEmpty)
    components + c.copy(interaction = c.interaction + i)
  else
    components

并像这样使用它:

val i1 = Interface("i1", "interface 1")
val a = Component("a", "description a", Set(i1))
val b = Component("b", "description b", Set())    
val components = addInterface(Set(a), b, i1)  // Set(Component(a,,Set(Interface(i1,))))
addInterface(components, b, Interface("i2", "interface 2")) // Set(Component(a,,Set(Interface(i1,))), Component(b,,Set(Interface(i2,))))

由于组件之间存在一对一的映射,只需从组中删除组件即可满足第二个约束:

components - a // Set()