Ich versuche, eine benutzerdefinierte Sammlung Schnittstelle in Scala 2.8 zu definieren. Ich möchte, dass Unterklassen Traversable, plus ein anderes Verhalten sind. Ich möchte auch Methoden wie map() den entsprechenden Typ zurückzukehren, wie unten:Wie definiere ich eine benutzerdefinierte Sammlung Schnittstelle in Scala, ohne eine Implementierung zu definieren?
trait CustomCollection[+A] extends Traversable[A] {
def customOperation(i:Int):Int // for example
}
def incrementAll(c:CustomCollection[Int]):CustomCollection[Int] = c.map { _ + 1 }
Dies gilt nicht kompilieren, weil CustomCollection.map() eine Traverszurückgibt. Ich denke, ich muss ein CanBuildFrom definieren, aber dann muss ich eine apply() -Methode definieren, die eine Instanz von Grund auf neu erstellt. Ich möchte keinen Weg geben, dies zu konstruieren; das sollte dem Implementierer überlassen bleiben. Ist das möglich?
Danke, axel22. Wenn ich Ihre Antwort verstanden habe, muss ich eine Standardimplementierung von CustomCollection bereitstellen, die von der newBuilder-Methode meines Companion verwendet wird. Ich hatte gehofft zu vermeiden, eine Standardimplementierung anzugeben. Könnten Sie näher erläutern, warum ich einen brauche? Es scheint nicht so, dass es für eine Methode wie map() notwendig sein sollte, weil Sie map() nur aufrufen können, wenn Sie bereits eine Implementierung haben. – traversable
Technisch gesehen könnten Sie es vermeiden, eine Standard-Builder-Implementierung im Compiler "CustomCollection" bereitzustellen, aber wie implementieren Sie dann die Methode "apply()" ohne Parameter in "CanBuildFrom"? Sie können zulassen, dass 'newBuilder' im Companion' CustomCollection' eine nicht unterstützte Operation ausgibt, wodurch eine Standardimplementierung vermieden wird.Ich glaube, dann würde alles funktionieren, bis auf die 'breakOut'-Methode in Sammlungen, die das parameterlose 'apply()' benötigt. – axel22
Ah ... also der Grund, warum ich eine Standardimplementierung brauche, ist, dass breakOut funktioniert. Vielen Dank! – traversable