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

Scala 如何将通用代码提取到一个方法中,scala,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) { ... } 如何将上述方法

如果我有一个包含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) {
 ...
}

如何将上述方法合并为一个(干式原则),使其接受
Shade
Type

您可以抽象case类并接受抽象类作为参数

如果您希望基于具体类型进行处理,则在输入上使用模式匹配,如下所示

  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"))
    }
  }
如果案例类没有公共字段,但它们以某种方式表示 同样的事情,那么你可以有“标记接口”


对不起,我没有意识到我的小示例与实际示例不符。
Type
案例类的属性是
Type
而不是
name
。这意味着我不能像您所展示的那样抽象case类。还有其他方法吗?如果它们没有共同点,那么您可能希望编写单独的函数。如果它们在某种程度上很常见,那么您可以在OO中引入一种称为“标记接口”的东西,即scalacan中的
trait Message
“标记接口”用于相同类型的属性(即字符串、int等),而不是属性的实际
name
?在您的示例中,如果
Type
case类是
case类类型(myType:String)扩展消息
,它将无法正确编译?因为“标记接口”意味着没有定义抽象,但您可以向具体类添加任意多的属性。所以当
消息
没有定义任何内容时,
案例类类型(myType:String)扩展消息
是完全正确的。参见我的第二个示例。希望这是有帮助的,没有一种特质不能仅仅定义为“类型”,特质定义了行为。您必须如上面的示例所示进行模式匹配,以确定它是哪个具体类,并基于此提取属性。您可以帮助我理解为什么这些类型不是描述
颜色的单一类型,例如
案例类颜色(shade:String,typ:String,available:Boolean)
 sealed trait Message
 case class Shade (myName: String) extends Message
 case class Type (myType: String) extends Message