내장 된 방법으로 ...내장으로 연장 컬렉션, 문제를 나는이 바보 같은 질문이지만, 여기에가는 경우 스칼라 초보자 그래서 용서입니다
내가 확장 된지도 유형을 생성 할 상상해 추가 방법이 포함됩니다. 나는 이것을 할 수있는 몇 가지 방법을 볼 수있다. 첫 번째 구성은 다음과 같습니다.
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)
}
: 아마도
http : // stackoverflow를 참조하십시오.co.kr/questions/3374923/how-can-you-inherit-a-generic-factory-method –