如何将通用代码提取到一种方法中

时间:2018-12-24 03:16:03

标签: scala

如果我的对象内部带有case类,则像这样:

object Color {
  case class Shade (name: String)
  case class Type (myType: String)
  case class Available (isAvailable: Boolean)
}

并且我有一个如下的方法:

def something(message: Shade) {
  ...
}
def something(message: Type) {
 ...
}

如何将上述方法变成一种(DRY原理),使其接受ShadeType

1 个答案:

答案 0 :(得分:0)

您可以抽象案例类并接受抽象类作为参数。

如果要基于具体类型进行处理,请在输入上使用模式匹配,如下所示。

  object Visitor {

    trait Message {
      def name: String
    }
    object Color {
      case class Shade (name: String) extends Message
      case class Type (name: String, myType: String) extends Message
      case class Available (isAvailable: Boolean)
    }

    def processSomething(message: Message): Unit = {
      message match {
        case Shade(name) => println(s"Shade: ${name}")
        case Type(name, myType) => println(s"Type: ${myType}")
      }
    }

    def main(args: Array[String]): Unit = {
      processSomething(Shade("I'm shade"))
      processSomething(Type("I'm type", "I'm type"))
    }
  }

如果案例类没有共同的字段,但它们以某种方式表示 同一件事,那么您可以拥有“标记界面”

 sealed trait Message
 case class Shade (myName: String) extends Message
 case class Type (myType: String) extends Message