2010-08-12 2 views
2

내장 된 방법으로 ...내장으로 연장 컬렉션, 문제를 나는이 바보 같은 질문이지만, 여기에가는 경우 스칼라 초보자 그래서 용서입니다

내가 확장 된지도 유형을 생성 할 상상해 추가 방법이 포함됩니다. 나는 이것을 할 수있는 몇 가지 방법을 볼 수있다. 첫 번째 구성은 다음과 같습니다.

class Path[V](val m: Map[V, Int]) { 
    // Define my methods 
} 

다른 하나는 상속을 통한 것입니다.

class Path[V] extends Map[V, Int] { 
// Define my methods 
} 

마지막으로, "특성"경로도 고려했습니다.

trait Path[V] extends Map[V, Int] { 
// Define my methods 
} 

구성 내용은 항상 내부의 것을 참조해야하기 때문에 조금 어색합니다. 상속은 상당히 자연 스럽지만 나에게 주름이있다. 형질은 이것을하는 매우 우아한 방법처럼 보입니다. "with"구조를 사용하면 정말 멋지지만 나에게도 문제가 있습니다.

나는 주름이 ++와 같은 방법을 사용하고 있습니다. 그들은 새로운지도를 반환합니다. 위에서 언급 한 '내 방법'을 사용하여지도에 무언가를 추가하고 싶다고 가정 해 보겠습니다 (예를 들어지도에 이미 있음).

trait Path[V] extends Map[V,Int] { 
    def addOne(v: V, i: Int): Path[V] = this + (v -> i) 
} 

반환 형식이 경로 [V]가 아니므로 오류가 발생합니다. 이제 새로운 인스턴스에서 "함께"사용하여 경로 [V] 특성을 추가 할 수 있다는 것을 알고 있습니다. 그러나 나는 여기서 새로운지도의 건설을 통제하지 않는다. 경로 [V] 특성을 추가 할 방법이 있습니까? 미리 채워진 새로운 불변 ​​맵을 작성한 다음 "경로 [V]"에 태그를 붙이는 것에 대해 생각했지만 미리 채워진 맵을 생성하는 데 사용할 수있는 생성자가 없습니다.

상속을 사용하여 비슷한 문제가 있다고 의심됩니다 (아직 확인하지는 못했지만). 지도에 새 항목을 추가하는 새로운 방법을 추가 할 수는 있지만 원하는 경로 인 [Path [V]]를 다시 얻지는 못합니다. 구성적인 접근 방식이 여기에 갈 수있는 유일한 방법 인 것 같습니다.

분명히하는 것이 좋겠습니다. 코멘트?

: 그것은 Map 인 것처럼 당신이 Path를 처리 할 수 ​​있도록하여이 조성 방식의 어색함을 제거

import collection._ 

class Path[V](val self: Map[V, Int]) extends MapProxy[V, Int] { 
    // without the companion object below 
    def addOne(v: V, i: Int): Path[V] = new Path(this + (v -> i)) 
    // with the companion object below 
    def addOne(v: V, i: Int): Path[V] = this + (v -> i) 
    // other methods 
} 

// this companion object is not strictly necessary, but is useful: 
object Path { 
    implicit def map2path[V](map: Map[V, Int]): Path[V] = new Path(map) 
} 

: 아마도

+0

http : // stackoverflow를 참조하십시오.co.kr/questions/3374923/how-can-you-inherit-a-generic-factory-method –

답변

6

이 작업을 수행하는 가장 간단한 방법은 MapProxy 특성을 사용하는 것입니다
scala> new Path(Map("a" -> 1)) + ("b" -> 2) 
res1: scala.collection.Map[java.lang.String,Int] = Map((a,1), (b,2)) 

scala> new Path(Map("a" -> 1)).get("a") 
res2: Option[Int] = Some(1) 

Map에서 Path까지의 암시 적 변환 (Path 동반 개체에 정의 됨)을 포함하는 경우 그것은 Path 인 것처럼 Map을 reat하십시오 Seq에 동작을 추가하는 유사한 SeqProxy 특성이 있습니다

scala> Map("a" -> 1).addOne("b", 2) 
res3: Path[java.lang.String] = Map((a,1), (b,2)) 

.

보다 일반적인 경우 해결 방법은 pimp my library pattern을 사용하는 것입니다. 여기에는 related question이 있습니다.

+0

솔루션에 대한 것이 아니라 포괄적 인 설명을 주셔서 감사합니다. 이것은 매우 시원하고 유용한 정보입니다. –

+0

MapProxy는 Scala 2.11.0부터 사용되지 않으므로 가능한 경우 사용하지 않는 것이 좋습니다. – Caoilte

관련 문제