your programing

생성자 vals를 지속적으로 복제하지 않고 스칼라 케이스 클래스를 확장합니까?

lovepro 2020. 12. 29. 08:09
반응형

생성자 vals를 지속적으로 복제하지 않고 스칼라 케이스 클래스를 확장합니까?


계속해서 새로운 값을 선택하지 않고 케이스 클래스를 확장하는 방법이 있습니까? 예를 들어 이것은 작동하지 않습니다

case class Edge(a:Strl, b:Strl)
case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int ) extends Edge(a,b)

"a"는 "a"와 충돌하므로 이름을 a1로 변경해야합니다. 그러나 "a"의 모든 종류의 추가 공개 사본을 원하지 않으므로 비공개로 설정했습니다.

case class Edge(a:Strl, b:Strl)
case class EdgeQA(private val a1:Strl, private val b1:Strl, right:Int, asked:Int ) extends Edge(a,b)

이건 깨끗하지 않은 것 같네요 .. 뭔가 빠졌나요?


이전 댓글 작성자가 언급했듯이 케이스 클래스 확장은 피해야하지만 Edge 클래스를 특성으로 변환 할 수 있습니다.

private 문을 피하려면 변수를 재정의로 표시 할 수도 있습니다.

trait Edge{
  def a:Strl
  def b:Strl
}

case class EdgeQA(override val a:Strl, override val b:Strl, right:Int, asked:Int ) extends Edge

특성 def보다 선호하는 것을 잊지 마십시오val


이 솔루션은 이전 솔루션에 비해 몇 가지 장점을 제공합니다.

trait BaseEdge {
  def a: Strl
  def b: Strl
}
case class Edge(a:Strl, b:Strl) extends BaseEdge
case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int ) extends BaseEdge

이런 식으로:

  • 중복 vals 가 없습니다.
  • 2 개의 케이스 클래스가 있습니다.

케이스 클래스는 서브 클래 싱을 통해 확장 할 수 없습니다. 또는 케이스 클래스의 하위 클래스는 케이스 클래스 자체가 될 수 없습니다.

참조 URL : https://stackoverflow.com/questions/11165432/extending-scala-case-class-without-constantly-duplicating-constructors-vals

반응형