Moim celem jest poprawienie wewnątrz kodu scala istniejącej klasy Java za pomocą mieszania cech. Na przykład, aby dodać metodę taką jak java.awt.Rectangle.translate (dx, dy) do klasy java.awt.geom.Ellipse2D. W tym celu utworzyć następującą cechę:Poprawić klasy Java za pomocą cech, jak zadeklarować wewnątrz cech pola 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
następnie użyć cechę przy konstruowaniu elipsę:
val egg = new java.awt.geom.Ellipse2D.Double(5, 10, 20, 30) with RectangleLike
Jednak kiedy wykonać powyższy skrypt w Scala REPL pojawia się następujący komunikat:
<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
Podejrzewam, że ten błąd wynika ze sposobu, w jaki Scala implementuje vars - jako pole prywatne i parę metod getter/setter. Czy to, co staram się osiągnąć? Czy istnieje inny sposób definiowania pól klasy java w tej cechie, a następnie odwoływanie się do nich w metodach konkretnych cech?
góry dzięki Jack Dimas
@forNelton imponujący! Dzięki mil naprawdę się na tym utknąłem. Muszę badać ukryte poglądy. – ideathbird
Nie ma za co. W zależności od rodzaju aplikacji, myślę, że pierwsze podejście może być bardziej odpowiednie, ponieważ wywołania metod mogą być znacznie szybsze bez wszystkich ukrytych problemów. – fotNelton