Mi objetivo es mejorar el código scala dentro de una clase Java existente utilizando una mezcla de rasgos. Por ejemplo, para agregar un método como java.awt.Rectangle.translate (dx, dy) a la clase java.awt.geom.Ellipse2D. Para ello se crea la siguiente característica:Mejora de las clases de Java utilizando rasgos, ¿cómo declarar dentro de los campos Java?
trait RectangleLike {
var x: Double // abstract vals to correspond to java class fields
var y: Double // I need these vars to refer to them inside translate method
def translate(dx: Double, dy: Double) {
x = x + dx
y = y + dy
}
// more concrete trait methods here
} // defines without errors in scala REPL
A continuación, utilice el rasgo en la construcción de una elipse:
val egg = new java.awt.geom.Ellipse2D.Double(5, 10, 20, 30) with RectangleLike
Sin embargo, cuando ejecuto el script anterior en REPL Scala me sale el siguiente resultado:
<console>:8: error: overriding variable x in trait RectangleLike of type Double;
variable x in class Double of type Double has incompatible type;
other members with override errors are: y
val egg = new java.awt.geom.Ellipse2D.Double(5, 10, 20, 30) with RectangleLike
Sospecho que este error se debe a la forma en que Scala implementa vars, como un campo privado y un par de métodos getter/setter. Es lo que trato de lograr factible? ¿Hay alguna otra forma de definir los campos de la clase java en el rasgo y luego referirnos a ellos dentro de los métodos de rasgo concreto?
Gracias de antemano Jack Dimas
@forNelton ¡impresionante! Gracias mil. Realmente estaba atrapado en esto. Tengo que estudiar puntos de vista implícitos. – ideathbird
De nada. Dependiendo del tipo de su aplicación, creo que el primer enfoque podría ser más apropiado, ya que es probable que las llamadas al método sean mucho más rápidas sin todas las molestias implícitas. – fotNelton