2014-09-01 4 views
-3

는이 같은 스칼라 특성 뭔가를 :메소드 내부에서 val을 재정의하려면 어떻게해야합니까?

trait A { 
def foo() 

val val1:Set[Set1] 
} 

나는이 특성을 확장하는 클래스를 가지고있다. 다음과 같이 입력하십시오 :

class B extends A { 

override val val1 = //Something 
override def foo() { 
    //change Something here 
} 
} 

가능합니까?

+0

가변성을 피하는 것이 가장 좋습니다. –

답변

4

defs으로 재정의 할 수 없습니다. 우선, 당신은 발을 reassing 수 없습니다

class B { 
    val val1 = Set("Something") 

    def foo(): Unit = { 
    val1 = Set("Some other thing") // reassigning val1; will not compile 
    } 
} 

val의 불변 변수를 나타내는, 그래서 당신은 이러한 변수 포함 된 내용은 변경할 수 없습니다.

그러나 이러한 변수가 유형을 지원하는지 내부에서 변경할 수 있습니다. 예를 들어, 우리는 변경 가능한 설정 val1을 할 경우 다음 방법으로이 세트 제품을 분해, 개조 :

import scala.collection.mutable 

class B { 
    val val1 = mutable.Set("Something") 

    def foo(): Unit = { 
    val1 += "Another thing" 
    } 
} 

그런 다음 그것을 잘 작동합니다.

0

foo 값의 값을 val1으로 변경하지 않는 한 val과 def를 정확히 덮어 쓰는 방법이 다릅니다.

당신은 valsdefsvals을 대체 할 수 있습니다,하지만 당신은 상속이 "변화"발스 함께 할 수 없다 vals

trait A { 
    val a:Int 
} 

class B extends A { 
    def a = 5   //Compilation error 
} 
+0

나는 def로 변경한다는 것을 의미하지는 않았다. 나는 방법의 내부에서 변화를 원합니다. 나는 그것이 가능하다고 생각한다. 그러나 어떻게? –

+0

'val's는 변경 가능한 컬렉션과 같이 변경 가능한 것을 사용하지 않는 한 변경되지 않습니다. 'val's anyware는 변경할 수 없습니다. 대신 var를 사용하십시오. – tiran

관련 문제