处理重复案例类的惯用方式

我正在学习案例课程。据我了解,案例类不能被其他案例类扩展。解决以下问题的惯用方式是什么:

我有两个案例类,A和B。它们是相同的,并馈入另一个案例类C。现在,当我想定义“ +”函数时,就会出现问题。可以在下面看到:

object Example extends App {
  // repetitive case classes A and B - Can they be abstracted to one case class?
  case class A(a: Int,b: String) {
    def f1(): Unit = println(a,b)
  }
  case class B(a: Int,b)
  }

  case class C(a: A,b: B) {
    def serialize() = Map("a" -> a,"b" -> b)
    def +(new_a: A): C = C(new_a,b)
    def +(new_b: B): C = C(a,new_b)
  }
}

上面的内容可以编译,但是非常重复。如果删除案例类B,而仅使用案例类A,则可以尝试执行以下操作:

// if I use the same type for both A and B,I cannot use + individually anymore
case class C_alt(a: A,b: A) {
  def serialize() = Map("a" -> a,"b" -> b)
  def +(new_a: A): C_alt = C_alt(new_a,b)
  def +(new_b: A): C_alt = C_alt(a,new_b)
}

但是,由于类型相同并且重载失败,我现在不能再为A和B同时拥有“ +”功能。

解决此代码重复问题的惯用scala方法是什么?理想情况下,我希望有一个实现这些方法的通用案例类,并且A和B都对其进行扩展。但是由于不允许通过其他案例类扩展案例类,因此我应该使用普通的类吗?

iCMS 回答:处理重复案例类的惯用方式

首先,您可以使用每个人都建议的常规class。而且,您可以使用copy(案例类提供)代替您的+方法。

但是,如果您想获得免费的case class函数并且有多种常见行为,则可以使用trait为您的类型抽象行为。

trait TDemo {
  def i: Int

  def s: String

  def f1(): Unit = println(i,s)

  def f2(): Int = i + 10

  def f3(): String = s + " LOL"

  def toString: String
}

case class Demo1(a: Int,b: String) extends TDemo
case class Demo2(a: Int,b: String) extends TDemo

trait TDemoWrapper[A <: TDemo,B <: TDemo] {
  def a: A

  def b: B

  def serialize() = Map("a" -> a,"b" -> b)
  
  def f1(): Unit = println(s"a :: $a,b :: $b")
}

case class DemoWrapper1(a: Demo1,b: Demo2) extends TDemoWrapper[Demo1,Demo2]
case class DemoWrapper2(a: Demo1,b: Demo1) extends TDemoWrapper[Demo1,Demo1]

本文链接:https://www.f2er.com/2039981.html

大家都在问