2014-10-14 3 views
0

나는 하나의 추상적 인 방법으로 형질을 창조한다. 그런 다음이 특성을 사용하는 클래스를 만듭니다. 이 클래스에는, 오버라이드 (override) 된 메소드가 있습니다. 그래서이 코드는스칼라 : 형질의 추상적 인 방법

trait Logged { 
    def log(msg: String) 
    } 

    class A extends Logged{ 
    def log(msg: String) { 
     println(msg) 
    } 
    def a(msg: String) { 
     log(msg) 
    } 
    } 

    val a = new A 
    a.log("jopa") 

를 잘 작동하지만이 특성을 만들 때 체인 상황이 혼란스러워 :

trait Logged { 
    def log(msg: String) 
    } 

    trait TimestampLogger extends Logged { 
    abstract override def log(msg: String) { 
     super.log("huy: " + msg) 
    } 
    } 

    class A extends Logged with TimestampLogger { 
    def log(msg: String) { 
     println(msg) 
    } 
    def a(msg: String) { 
     log(msg) 
    } 
    } 

    val a = new A 
    a.log("jopa") 

이 코드는 둘 다 overridden 로그 방식의 수정과 함께 작동하지 않으며, 아무것도 나는 시도했다. 무엇이 문제입니까?

+3

'TimestampLogger'의'super.log'는 의미가 없습니다. 그것은 구현되지 않았습니다. –

+0

@LimbSoup 그럼 어떻게 로그 계층 구조를 사용할 수 있습니까? 어떻게 그 로그 방법을 사용할 수 있습니까? – zapadlo

+0

Logged에 기본 (그러나 추상적이 아닌) 정의를 원하지 않습니까? 그런 다음 하위 클래스에서 재정의 할 수 있습니다. –

답변

1

를 사용하여 스택 특성이 방법은 :

http://www.artima.com/pins1ed/traits.html#12.5

구체적인 구현 선형화 위해 부모에 있어야합니다.

new A with TimestampLogger 

trait Logged { 
    def log(msg: String) 
} 

trait TimestampLogger extends Logged { 
    abstract override def log(msg: String) { 
     super.log("huy: " + msg) 
    } 
} 

class A extends Logged { 
    def log(msg: String) { 
     println(msg) 
    } 
    def a(msg: String) { 
     log(msg) 
    } 
} 

object Test extends App { 
    val a = new A with TimestampLogger 
    a.log("jopa") 
} 

또는 유사한.

관련 문제