Domanda

Ho scritto un tratto personalizzato che si estende Iterator [A] e mi piacerebbe essere in grado di utilizzare i metodi che ho scritto su un Iterator [A] che viene restituito da un altro metodo. È possibile?

trait Increment[+A] extends Iterator[A]{
    def foo() = "something"
}

class Bar( source:BufferedSource){
    //this ain't working
    def getContents():Increment[+A] = source getLines
}

Sto ancora cercando di ottenere la mia testa intorno alla cosa interi impliciti e non avendo molto simile a scrivere un metodo nella definizione dell'oggetto Bar. Come potrei fare per il confezionamento tale elemento al lavoro nel modo in cui mi piacerebbe sopra?

È stato utile?

Soluzione

capito. Mi ha portato un paio di tentativi per capire:

object Increment{
    implicit def convert( input:Iterator[String] ) = new Increment{
        def next() = input next
        def hasNext() = input hasNext
    }
}

e ho finito. Così sorprendentemente breve.

Altri suggerimenti

Non credo che questo è possibile senza trucchi di gioco. Un'eredità mixin avviene al momento della compilazione, quando può essere di tipo controllato staticamente, ed è sempre rivolto a un'altra classe, caratteristica, ecc Qui si tenta di virare un tratto su un oggetto esistente "al volo" in fase di esecuzione.

Non ci sono soluzioni alternative, come le conversioni implicite, o forse proxy. Probabilmente il modo "pulito" sarebbe quello di fare Incremento una classe wrapper delegando a un Iterator sottostante. A seconda del caso d'uso ci potrebbe essere altre soluzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top