2013-01-07 4 views
1

저는 스칼라를 처음 사용하기 때문에 연습 만하고 있습니다. 에서 변수 nextDevice 때문에, 클래스 입력이 추상적 할 필요가 : 추상 클래스를 사용한 스칼라 상속

abstract class Device(val cds: Array[Char]) { var codes = Array[Char](cds: _*) def encrpt(code: Char): Char var nextDevice: Device def setNext(next: Device):Unit = { nextDevice = next } } //compiler error shows here class Input(codes: Array[Char]) extends Device(codes) { override def encrpt(code: Char) = code } 
당신이 거기에 라인 (21)에서 컴파일러 오류가 있습니다 다음 볼 수

는 메시지입니다

: 나는, 아주 간단한 프로그램을 시도 은 다음과 브리핑 형 com.me.acm.problem1009.Device의 클래스 장치는,

은 내가 꽤 혼동하는 오류, 내 이해 (변수를 정의 할 수 초기화해야합니다) 어떤 변수와 정의 정의되지 입니다 setter 메서드를 부모 클래스에서 사용하므로 자식 클래 ses는 그것을 다시 정의하지 않고 사용할 수 있습니다. 그것은 곧장 앞으로입니다.

내가 놓친 것 같아. 누군가 나에게 설명하고 올바른 방법이 무엇인지 말할 수 있습니까? 감사.

+0

참고 명시 적 getter 및 setter, VAR 선언은 선언 할 필요가 없습니다 암시 적으로 getter와 setter로 확장되었습니다. 구체적인 멤버에게 어떻게 발생하는지 [this] (http://www.artima.com/pins1ed/stateful-objects.html#18.2)와 [that] (http://www.artima.com/pins1ed/) abstract-members.html # 20.4). – huitseeker

답변

4

으로 변경해야합니다. 스칼라에서 변수는 Java (또는 많은 다른 언어)에서와 마찬가지로 기본값을 가정하지 않았습니다. 따라서 변수를 선언 할 때 항상 초기 값을 지정해야합니다.

코드에서 변수 nextDevice을 선언하지만 값을주지 마십시오. 스칼라는 항상 값을 필요로하기 때문에, 여러분이 작성한 것을 추상 필드로 해석하므로 컴파일러는이를 덮어 써야한다고 알려줍니다.

당신은, 예를 들어, 다음과 행을 변경해 초기 값을 지정하는 경우, 오류가 사라집니다 :

var nextDevice: Device = new Input(Array()) 
+0

감사합니다. 꽤 도움이됩니다. – user1484819

3

오류 메시지가 표시되면 nextDevice 변수는 생성자에서 Input으로 초기화해야합니다. null를 사용하는 것은 스칼라에 눈살을 찌푸리게되는

class Input(codes: Array[Char]) extends Device(codes) { 
    override def encrpt(code: Char) = code 
    nextDevice = null 
} 

참고. 변수 유형을 Option[Device]

+0

고마워, 지금은 더 분명해. – user1484819

관련 문제