Estoy tratando de crear un rasgo que, cuando se mezcla, reemplazará la definición predeterminada de un método con uno que llame al método original y luego manipule el resultado.Llamar a un método en la superclase en un rasgo auto tipado en scala
Aquí 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 funcionaba de la manera que yo quería que, a continuación, volver (new Quux).bar
sería ahora Foos bar with OtherStuff
. Por desgracia, no funciona de esa manera - lo que consigo 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 uso override
al definir OtherStuff
, me sale:
<console>:7: error: method bar overrides nothing
override def bar() : String = self.bar() + " with OtherStuff"
¿Es posible sustituir un método en una auto-tipo usando rasgo? Si no es así, se cambia OtherStuff
a ser un rasgo que extends Foo
en lugar de uno que tiene un auto tipo de Foo
hacer nada malo a 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 complementos de los que dependemos no están listos aún)
¿Qué pasa si OtherStuff no es un Foo en mi lógica? ¿No hay otra solución sin extender Foo? ¿O estoy abusando de tipear aquí? – Radian
@Dupont: ¿Por qué debería la clase Quux extender Foo con OtherStuff en lugar de simplemente extender OtherStuff y obtener Foo de la herencia? – polo