2012-07-10 2 views
1

Swing 및 Wicket 응용 프로그램에서는 프레임 워크에서 제공하는 클래스의 메서드를 재정의하는 것이 일반적입니다. 예를 들어 :스칼라에서 오버라이드를 스태킹 가능 형질과 어떻게 조합 할 수 있습니까?

abstract class Form(id: String) { 
    def onSubmit() 
    def error(msg: String) { println(msg) } 
} 

많은 형태로 구현 오류 처리가 필요합니다

val form = new Form("form") { 
    override def onSubmit() { println("Form was submitted") } 
} 

예에 대한 양식은 다음과 같이 정의 할 수 있습니다 곳.

val form = new Form("form") { 
    override def onSubmit() { println("Form was submitted") } 
} with FormErrorHandler // DOES NOT COMPILE 

내가 그것을 해결할 : : 지금이 결합하려고하면

trait FormErrorHandler extends Form { 
    abstract override def onSubmit() { 
    try super.onSubmit() 
    catch { case e: Exception => error("error during submit " + e.getMessage) } 
    } 
} 

내가 컴파일러 오류를 얻을 :

class MyForm extends Form("form") { 
    override def onSubmit() { println("Form was submitted") } 
} 
val form = new MyForm with FormErrorHandler 

을하지만 단지를이를 위해 나는 스택 특성을 생성 읽지 않는다. 나는 익명 인 클래스를 명명해야한다.

이 모양을 멋지게 만들려면 어떤 제안을 원하십니까? 향후 스칼라 버전에 구문 구조를 적용 해 보았습니까?

답변

1

메서드를 재정의하는 익명 클래스를 만든 다음 나중에 특성에 혼합 할 수는 없습니다. 그러나 쉬운 방법이 있습니다. 특성 (예 : abstract def mySubmit)의 다른 방법을 정의한 다음 하위 항목을 채우십시오 (또는 기본적으로 유용한 기능을 수행하고 원하는 경우 재정의하십시오).

그런 다음 오류 처리기를 먼저 혼합하고 익명 블록에서 새 메서드를 재정의 할 수 있습니다.

+1

감사합니다. 이 해결 방법의 단점은 방해가된다는 것입니다. 프레임 워크 (이 경우 Wicket)를 아는 사람들은 mySubmit이 아니라 onSubmit을 자동으로 재정의합니다. 또한 stackable 특성의 'stacking'부분을 잃어 버리게됩니다. IMHO 이러한 단점은 중간 클래스에 이름을 부여하는 해결 방법이 더 나쁩니다. –

+1

@ErikvanOosten - 다른 순서로 스태킹이 스태킹 중입니다. 그러나 프레임 워크를 아는 사람들에게 더 읽기 쉽도록 코드를 작성하는 것이 아마도 더 좋은 방법 일 것이라고 나는 동의한다. –

관련 문제