저는 스칼라를 처음 접했고 몇 가지 간단한 문제로 인해 어려움을 겪고 있습니다. , 첫째로, 나는 이러한 클래스의 요소에 액세스 할 수 없습니다 그래서 leftchild
, head
필드를 구현 :스칼라에서 추상 클래스 필드 생성 및 액세스
abstract class IntSet {
def incl(x: Int): IntSet
def contains(x: Int): Boolean
}
class Empty extends IntSet {
def contains(x: Int): Boolean = false
def incl(x: Int): IntSet = new NonEmpty(x, new Empty, new Empty)
}
class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {
val head = elem
val leftChild = left
val rightChild = right
def contains(x: Int): Boolean =
if (x < elem) left contains x
else if (x > elem) right contains x
else true
def incl(x: Int): IntSet =
if (x < elem) new NonEmpty(elem, left incl x, right)
else if (x > elem) new NonEmpty(elem, left, right incl x)
else this
}
val my_intset = new NonEmpty(5, new Empty, new Empty)
my_intset.head
val new_intset = my_intset.incl(10)
new_intset.head
를 그리고 두 가지 문제로 실행 : 나는 다음과 같이 정수를 저장하는 간단한 이진 트리를 구현하고있어 및 rightchild
. 어느 누구도 my_intset
에 액세스 할 수 있습니다. 그러나 incl
이 호출되면 개체 유형이 변경되고 new_intset
은 이제 IntSet
이되어 다시 요소에 액세스 할 수 없게됩니다. 그러한 필드가 항상 액세스 할 수 있도록하려면 어떻게해야합니까?
둘째, incl
을 호출하면 개체 유형이 변경된다는 것이 불편합니다. 사용자 관점에서 볼 때이 두 객체는 모두 IntSet
의 인스턴스라고 생각합니다. 그게 내 의도입니다. 나는 염려 할 만하니? 이 동작을 제어 할 수있는 방법이 있습니까?
좋아요!도와 주셔서 대단히 감사합니다. – aspaceo
@aspaceo 환영합니다. –