2014-10-18 29 views
41

Các lớp dữ liệu dường như là sự thay thế cho các POJO kiểu cũ trong Java. Nó là khá mong đợi rằng các lớp này sẽ cho phép thừa kế, nhưng tôi có thể thấy không có cách thuận tiện để mở rộng một lớp dữ liệu. Những gì tôi cần là một cái gì đó như thế này:Mở rộng lớp dữ liệu trong Kotlin

open data class Resource (var id: Long = 0, var location: String = "") 
data class Book (var isbn: String) : Resource() 

Đoạn mã trên không thành công do xung đột component1() phương pháp. Việc để lại chú thích data chỉ trong một lớp cũng không thực hiện công việc.

Có thể có một thành ngữ khác để mở rộng các lớp dữ liệu?

UPD: Tôi có thể chú thích chỉ lớp con của trẻ, nhưng data chú thích chỉ xử lý các thuộc tính được khai báo trong hàm tạo. Đó là, tôi sẽ phải kê khai tài sản của cha mẹ tất cả open và ghi đè lên chúng, mà là xấu xí:

open class Resource (open var id: Long = 0, open var location: String = "") 
data class Book (
    override var id: Long = 0, 
    override var location: String = "", 
    var isbn: String 
) : Resource() 
+0

Component1 ??? – maaartinus

+0

Kotlin ngầm tạo ra các phương thức 'componentN()' trả về giá trị của thuộc tính N-th. Xem tài liệu trên [Multi-Declarations] (http://kotlinlang.org/docs/reference/multi-declarations.html) – Dmitry

+0

Để mở các thuộc tính, bạn cũng có thể tạo tài nguyên trừu tượng hoặc sử dụng trình biên dịch plugin. Kotlin nghiêm túc về nguyên tắc mở/đóng. –

Trả lời

33

Sự thật là: các lớp dữ liệu không chơi quá tốt với thừa kế. Chúng tôi đang xem xét cấm hoặc hạn chế nghiêm trọng việc thừa kế các lớp dữ liệu. Ví dụ, nó được biết rằng không có cách nào để thực hiện equals() một cách chính xác trong một hệ thống phân cấp trên các lớp không trừu tượng.

Vì vậy, tất cả những gì tôi có thể cung cấp: không sử dụng thừa kế với các lớp dữ liệu.

+0

Hey Andrey, bằng() khi nó được tạo ra trên các lớp dữ liệu hoạt động ngay bây giờ? Nó chỉ phù hợp nếu loại là chính xác và tất cả các trường chung là bằng nhau, hoặc chỉ khi các trường bằng nhau? Nó có vẻ như, vì giá trị của kế thừa lớp cho xấp xỉ các loại dữ liệu đại số, nó có thể là giá trị đến với một giải pháp cho vấn đề này. Thật thú vị, một tìm kiếm nguyền rủa tiết lộ cuộc thảo luận này về chủ đề của Martin Odersky: http://www.artima.com/lejava/articles/equality.html – orospakr

+1

Tôi không tin rằng có nhiều giải pháp cho vấn đề này. Ý kiến ​​của tôi cho đến nay là các lớp dữ liệu không được có lớp con dữ liệu chút nào. –

+1

nếu chúng ta có một mã thư viện như một số ORM và chúng ta muốn mở rộng mô hình của nó để có mô hình dữ liệu liên tục của chúng ta? –

18

Khai báo các thuộc tính trong lớp siêu bên ngoài của hàm khởi tạo dưới dạng trừu tượng và ghi đè chúng trong lớp con.

abstract class Resource { 
    abstract var id: Long 
    abstract var location: String 
} 

data class Book (
    override var id: Long = 0, 
    override var location: String = "", 
    var isbn: String 
) : Resource() 
+1

điều này dường như là linh hoạt nhất. Tôi rất mong ước chúng ta chỉ có thể có các lớp dữ liệu kế thừa từ nhau ... – Adam

+0

cách tốt nhất –

Các vấn đề liên quan