Scala 如何将通用代码提取到一个方法中
如果我有一个包含case类的对象,如下所示: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) { ... } 如何将上述方法
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