2017-10-16 7 views
0

키 값 쌍을 사용하는 클래스가 있습니다.이 클래스는지도 객체 또는 사례 클래스의 형태로 제공 될 수 있습니다. 다음 추상화를 정의 할 수 있습니다.기존 클래스를 스칼라로 특성 구현

trait Reportable { 
    def getAttributes : Map[String,Any] 
    } 

List [Reportable]을 취하는 메소드가 필요합니다. 보고에 대한 가능한 구현은 다음과 같습니다

  • 지도의 구현은 단지 자체
  • 나는 경우 클래스에서 속성을 가지고지도
  • 에 넣어 리플렉션을 사용하여 무언가를 사용할 수있는 경우 클래스가 될 것입니다

문제는 내가 어떻게 제품 (모든 사례 클래스의 기본 클래스) 및지도 클래스 내 특성을 구현하는 알아낼 수 없습니다. 기존 클래스를 가져 와서보고 가능한 특성을 혼합하여 클래스가 이미 가지고있는 메소드 측면에서 구현할 수 있기를 원합니다.

답변

4

그런 특성을 혼합 할 수는 없다고 생각합니다.

그러나 imho는 EnrichMyLibrary 패턴의 경우와 비슷합니다. Map의 예 :

trait Reportable { 
    def getAttributes : Map[String,Any] 
} 

object Reportable { 
    implicit class MapReportableOps(private val underlying: Map[String, Any]) extends Reportable { 
    def getAttributes: Map[String, Any] = underlying 
    } 
} 

사용법 :

val reportables: List[Reportable] = Map("foo" -> "bar") :: Nil 

컴파일러는 Reportable이 예상되는 곳마다지도에 대한 암시 래퍼 클래스 MapReportableOps을 찾아서 Reportable을 만들어야합니다.

+0

불법 상속을 시도 할 때 오류가 발생합니다. 슈퍼 클래스 AnyVal 은 슈퍼 클래스의 서브 클래스가 아닙니다. Object mixin 특성 Reportable 암시 적 클래스 MapReportableOps (private val 기본 : Map [String, Any])는 Reportable {로 AnyVal을 확장합니다. 나는 scala에있다. 2.11 –

+2

그냥'extends AnyVal'을 제거하라. –