objetos metodos introduccion herencia ejemplos clases scala scala-2.7

metodos - scala introduccion



Llamando a un método en la superclase en un rasgo autodeclarado en scala (2)

Estoy tratando de crear un rasgo que, al mezclarse, reemplazará la definición predeterminada de un método con uno que llama al método original y luego manipula el resultado.

Esto es lo que estoy tratando de hacer:

class Foo { def bar() : String = "Foos bar" } trait OtherStuff { self : Foo => def bar() : String = self.bar() + " with OtherStuff" } class Quux extends Foo with OtherStuff

Si esto funcionó como yo quería, entonces (new Quux).bar ahora devolvería la Foos bar with OtherStuff . Desafortunadamente, no funciona de esa manera, lo que obtengo es:

<console>:6: error: error overriding method bar in class Foo of type ()String; method bar in trait OtherStuff of type ()String needs `override'' modifier class Quux extends Foo with OtherStuff

Pero si utilizo override al definir OtherStuff , obtengo:

<console>:7: error: method bar overrides nothing override def bar() : String = self.bar() + " with OtherStuff"

¿Es posible anular un método en un auto-tipo usando un rasgo? Si no, cambiará OtherStuff para que sea un rasgo que extends Foo lugar de uno que tenga un tipo de Foo haga algo malo en todo el código que existe diciendo cosas como

class WhatEver extends Foo with Xyz with Pqr with OtherStuff with Abc

Estoy trabajando en scala 2.7.7 porque esta es una regla de compilación sbt, y aún no hemos actualizado nuestro proyecto sbt a las versiones 0.10.x. (Los plugins de los que dependemos todavía no están listos)


Necesitas una abstract override y ningún tipo de auto para eso.

trait OtherStuff extends Foo { abstract override def bar() = super.bar() + " with OtherStuff" }

Entonces la class Quux extends Foo with OtherStuff hace lo que quieres.

Este artículo puede ser de interés.


O puedes hacer una sobrecarga como la siguiente

class Foo { def bar() : String = "Foos bar"} trait OtherStuff { self : Foo => def bar( s : String) : String = self.bar() + s} class Quux extends Foo with OtherStuff (new Quux).bar(" with other stuff")

La cosa es que, con la anotación de auto tipo, la "otra cosa" definida en OtherStuff es parte de Foo cuando el Rasgo se mezcla con Foo, en lugar de una relación de subtipo.