Frage

Ich habe eine benutzerdefinierte Eigenschaft geschrieben, den Iterator [A] erweitert und ich möchte in der Lage sein, die Methoden zu verwenden, die ich auf einem Iterator [A] geschrieben habe, die aus einem anderen Verfahren zurückgeführt wird. Ist das möglich?

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

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

Ich versuche immer noch meinen Kopf um die ganze implicits Sache zu bekommen und nicht viel mit, wie ein Verfahren, bei der Bar Objektdefinition zu schreiben. Wie würde ich mich über einen solchen Gegenstand zu Arbeit in der Art und Weise wickeln oben möchte ich?

War es hilfreich?

Lösung

es herausgefunden. Habe mir ein paar versucht zu verstehen:

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

und ich bin fertig. So erstaunlich kurz.

Andere Tipps

Ich glaube nicht, dass dies ohne Spiel Tricks möglich ist. Eine mixin Vererbung geschieht bei der Kompilierung, wenn es statisch typgeprüft werden kann, und es wird immer an einer anderen Klasse gezielt, Zug usw. Hier können Sie versuchen, „on the fly“ zur Laufzeit ein Merkmal auf ein vorhandenes Objekt zu heften.

Es gibt Workarounds wie implizite Konvertierungen, oder vielleicht Proxies. Wahrscheinlich wäre der „sauberste“ Weg Erhöhungsschritte eine Wrapper-Klasse zu einem darunter liegenden Iterator Delegieren zu machen sein. Je nach Anwendungsfall könnte es andere Lösungen sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top