2014-04-19 7 views
14

avere un codice:Come creare un'istanza tratto che estende la classe con il costruttore

class A(name:String) 
trait E extends A 

new E{} //compile error 

è tale eredità possibile? Ho cercato di creare val o def nel corpo della classe anonima, non aiuta.

+0

no. un tratto Scala non può estendere una classe, solo altri tratti. –

+2

infatti un tratto può estendere una classe ma non chiamare il suo costruttore (che è il problema in questo caso). Mi chiedo perfino perché una tale dichiarazione di tratto sia compilata. – sschaef

+0

@SteveWaldman @sschaef I tratti possono estendere le classi, anche con gli argomenti del costruttore. 'classe B (nome: String) estende A (nome) con E' è un esempio di un modo completamente perfetto per usare un tale tratto. – ghik

risposta

12

soluzioni possibili alcuni:

1) impostare il valore predefinito per nome in classe A costruttore:

class A(name : String = "name") 
trait E extends A 
new E {} // {} is obligatory. trait E is abstract and cannot be instantiated` 

2) mix tratto E alla istanza di A:

object inst extends A("name") with E 
// or: 
new A("name") with E 
+0

Scala dovrebbe vietare la triait estende la classe, è inutile in quanto non può essere istanziata. –

2

A accetta un argomento costruttore, quindi è necessario passarlo, ad es.

new A("someName") with E 
+0

Quindi non posso istanziare E che inizia con 'nuova E' ...? – ka4eli

0

Se si desidera limitare il tratto E per essere mescolati con la classe A, è possibile utilizzare solo il tipo di sé. Tuttavia questo non è un modo per definire la variabile come nuova E con A (...)

class A(val name: String) 

trait E { self: A => 
    def printName() = println(self.name) 
} 

val e = new A("This is A") with E 
e.printName() 
Problemi correlati