Enumeration # Val 클래스의 Scaladoc에서 읽을 수 있습니다 : "Value 형식을 구현하는 클래스.이 클래스는 열거의 명명 및 정수 식별 동작을 변경하기 위해 재정의 될 수 있습니다." 나는 당황 스럽다 : 나는 어떻게 수업을 무효화 하는가? override class Val extends super.Val
같은 것은 허용되지 않습니다.스칼라에서 내부 클래스를 "오버라이드"하는 방법은 무엇입니까?
답변
스칼라에는 아직 가상 클래스가 없으므로 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으로 선언하여 프로그래머가 팩토리 메서드를 사용하도록 보장함으로써 보장 할 수 있습니다.
설명해 주셔서 감사합니다. 이제는 내가 어떻게 최종 메소드를 오버라이드하는 지에 대해 더욱 궁금해합니다. –
흠 ... 당신 말이 맞아요. 내가 이것을 확인하겠습니다. – axel22
(다른 독자를위한 설명과 마찬가지로, 여러분이 언급 한 방법은 실제로 Enumeration.scala에서 마지막입니다.) 그런데 "Scala에는 아직 가상 클래스가 없습니다"라고 적어 두었습니다. 이것이 미래에 올 수있는 증거가 있습니까? –
내부 클래스를 정의 할 수 있습니다. 클래스 Val (i : Int, name : String)은 super.Val (i, name)'을 확장하지만, Enumeration # Val은 인스턴스화되지 않으므로 Enumeration # Val을 거의 오버라이드하지 않습니다. 모든. –