2010-12-02 1 views
9

Enumeration # Val 클래스의 Scaladoc에서 읽을 수 있습니다 : "Value 형식을 구현하는 클래스.이 클래스는 열거의 명명 및 정수 식별 동작을 변경하기 위해 재정의 될 수 있습니다." 나는 당황 스럽다 : 나는 어떻게 수업을 무효화 하는가? override class Val extends super.Val 같은 것은 허용되지 않습니다.스칼라에서 내부 클래스를 "오버라이드"하는 방법은 무엇입니까?

+0

내부 클래스를 정의 할 수 있습니다. 클래스 Val (i : Int, name : String)은 super.Val (i, name)'을 확장하지만, Enumeration # Val은 인스턴스화되지 않으므로 Enumeration # Val을 거의 오버라이드하지 않습니다. 모든. –

답변

12

스칼라에는 아직 가상 클래스가 없으므로 override class Val ...을 쓸 수 없으므로 new Val을 호출하면 동적으로 올바른 인스턴스를 선택할 수 있습니다. 대신 클래스를 포함하는 클래스의 인스턴스에 대한 참조 유형 (이 경우 Enumeration)을 기반으로 클래스를 선택해야합니다.

가상 클래스를 에뮬레이트하는 일반적인 트릭은 class Val extends super.Val으로 작성한 다음 클래스 인스턴스의 팩토리로 사용되는 보호 된 메서드를 재정의하는 것입니다. 이 경우, 당신은 또한 메소드를 오버라이드 (override) 할 것입니다 :

protected def Value(i: Int, name: String): Value = new Val(i, name) 

Enumeration 만이 팩토리 메소드를 사용하여 Val의 인스턴스를 생성합니다. 일반적으로이 패턴은 프로그래머 측에서 규율을 필요로하지만 생성자를 private으로 선언하여 프로그래머가 팩토리 메서드를 사용하도록 보장함으로써 보장 할 수 있습니다.

+0

설명해 주셔서 감사합니다. 이제는 내가 어떻게 최종 메소드를 오버라이드하는 지에 대해 더욱 궁금해합니다. –

+0

흠 ... 당신 말이 맞아요. 내가 이것을 확인하겠습니다. – axel22

+0

(다른 독자를위한 설명과 마찬가지로, 여러분이 언급 한 방법은 실제로 Enumeration.scala에서 마지막입니다.) 그런데 "Scala에는 아직 가상 클래스가 없습니다"라고 적어 두었습니다. 이것이 미래에 올 수있는 증거가 있습니까? –