Mục tiêu của tôi là tăng cường bên trong mã scala một lớp Java hiện có bằng cách sử dụng một kết hợp đặc điểm. Ví dụ để thêm một phương thức như java.awt.Rectangle.translate (dx, dy) vào lớp java.awt.geom.Ellipse2D. Đối với điều này tôi tạo ra các đặc điểm sau:Tăng cường các lớp học java bằng cách sử dụng các đặc điểm, cách khai báo bên trong các đặc điểm của các trường 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
Sau đó sử dụng các đặc điểm khi xây dựng một Ellipse:
val egg = new java.awt.geom.Ellipse2D.Double(5, 10, 20, 30) with RectangleLike
Tuy nhiên khi tôi thực thi kịch bản nêu trên trong scala REPL tôi nhận được kết quả như sau:
<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
Tôi nghi ngờ rằng lỗi này là do cách Scala thực hiện các vars - như một trường riêng và một cặp getter/setter của các phương thức. Là những gì tôi cố gắng để đạt được doable? Có cách nào khác để xác định các lĩnh vực lớp java trong đặc điểm và sau đó tham khảo chúng bên trong các phương pháp đặc điểm cụ thể?
Cảm ơn trước Jack Dimas
@forNelton ấn tượng! Cảm ơn một triệu Tôi thực sự đã bị mắc kẹt về điều này. Tôi phải nghiên cứu các quan điểm ngầm định. – ideathbird
Bạn được chào đón. Tùy thuộc vào loại ứng dụng của bạn, tôi nghĩ cách tiếp cận đầu tiên có thể phù hợp hơn vì các cuộc gọi phương thức có khả năng nhanh hơn mà không có tất cả các rắc rối tiềm ẩn. – fotNelton