2014-10-14 2 views
0

Я создаю черту с одним абстрактным методом. Затем я создаю класс, который использует этот признак. Этот класс содержит конкретный переопределенный метод. Так что этот код работает отличноscala: абстрактные методы в чертах

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

'super.log' в' TimestampLogger' не имеет смысла. Это не реализовано. –

+0

@ LimbSoup, так как я могу использовать иерархию журнала? Как я могу использовать этот метод журнала? – zapadlo

+0

Вы не хотите, чтобы определение по умолчанию (но не абстрактное) записывалось в журнале? Затем вы можете переопределить его в подклассах. –

ответ

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") 
} 

или аналогичный.