具有相同功能但不同类型的多种方法

时间:2015-12-18 19:57:22

标签: scala

使用Scala,我有一个由InputNodes和OutputNodes组成的网络,它们都扩展了一个共同特征NetworkNode。但是,我想在管理器类中添加一个节点,该节点具有针对不同类型节点的单独私有集合。这是我的第一次尝试:

  // Adds a node into the network, depending on type.
  def addNode(node: InputNode, name: String = "") = {
    if (!name.isEmpty()) {
      node.name = name
    }
    this.inputNodes += node
  }

  def addNode(node: OutputNode, name: String = "") = {
    if (!name.isEmpty()) {
      node.name = name
    }
    this.outputNodes += node
  }

然而,有两个问题。

1)代码基本相同,但我无法将NetworkNode添加到ArrayBuffer [InputNode],因此需要更具体的类型。

2)无法在相同位置使用默认值重载参数。

由于我希望代码增长,我希望在单个addNode函数中完成所有操作,该函数可以使用匹配结构来根据类型选择附加新节点的位置。这将解决这两个问题,但我怎样才能解决集合类型问题?例如,以下内容不起作用:

  // Adds a node into the network, type NetworkNode is the common parent.
  def addNode(node: NetworkNode, name: String = "") = {
    if (!name.isEmpty()) {
      node.name = name
    }

    // Say we deduce class based on a field called TYPE.
    node.TYPE match {
      case "input" => inputNodes += node    // node is a NetworkNode, not an InputNode!!!
      case "output" => outputNodes += node
      case _ => throw new Exception("Type " + node.TYPE + " is not supported!")
    }
  }

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

此匹配为您进行类型转换。

// Adds a node into the network, type NetworkNode is the common parent.    
def addNode(node: NetworkNode, name: String = "") = {
 if (!name.isEmpty()) {
   node.name = name
 }

 node match {
   case x : InputNode  => inputNodes += x
   case x : OutputNode   => outputNodes += x
   case _ => throw new Exception("Type " + node.TYPE + " is not supported!")
 }
}