2017-08-09 13 views
7

Tôi đang vật lộn với các lớp dữ liệu và tính đa hình. Tôi muốn hưởng lợi từ sự bất biến, nhưng vẫn có thể cập nhật trạng thái của tôi. Đối với điều này, tôi hy vọng sẽ có thể sử dụng chức năng copy.Cách cập nhật các lớp dữ liệu thực hiện một giao diện chung

Hãy đưa ra một ví dụ. Tôi có lớp phân cấp này:

interface Aging { 
    val age : Int 
} 

data class Cheese (
    override val age : Int 
    // more Cheese specific properties 
) : Aging 

data class Wine (
    override val age : Int, 
    val grape : String 
    // more Wine specific properties 
) : Aging 

Và bây giờ tôi muốn để có thể làm điều gì đó như thế này (nhưng này không làm việc):

class RipeningProcess(){ 
    fun ripen(products : List<Aging>) = 
    // Not possibe, no copy function on Aging 
    products.map { it.copy(age = it.age + 1) } 
} 

Làm thế nào tôi có thể tạo ra các bản sao cập nhật trong một cách đa hình?

Tôi đã cố gắng cung cấp giao diện cho hàm copy, nhưng nếu các kiểu con có các thuộc tính bổ sung, chúng không ghi đè lên hàm sao chép.
Thật khó chịu vì tôi biết các loại phụ có thuộc tính đó, nhưng tôi không thể sử dụng kiến ​​thức đó trong giao diện.

Trả lời

4

[OP:] Cú pháp tốt nhất mà tôi đã đưa ra thực sự là tuyên bố chức năng sao chép trong giao diện:

interface Aging { 
    val age : Int 
    fun copy(age : Int) : Aging 
} 

này hoạt động ra khỏi hộp cho phân nhóm lớp dữ liệu mà không thuộc tính bổ sung (ví dụ Cheese từ câu hỏi). Đối với các kiểu con lớp dữ liệu với các thuộc tính bổ sung, bạn cần khai báo nó một cách rõ ràng, vì hàm copy được tạo không ghi đè lên một từ giao diện.

Các kiểu phụ với đó là thực hiện với lứa tuổi sao trông giống như:

data class Wine(
    override val age : Int, 
    val grape : String 
) : Aging { 

    // Different parameter name, to avoid conflict with generated copy method 
    override fun copy(_age: Int) = copy(age = _age) 
} 

Hy vọng cho các giải pháp tốt hơn (hoặc một sự cải thiện Kotlin;)).

Chỉnh sửa: được cập nhật để theo dõi đề xuất của Ghedeons.

+1

Một cách khác để đánh lừa nó vào việc chọn đúng phương pháp sẽ có tên khác cho tham số sao chép. Ví dụ: 'sao chép vui vẻ ghi đè (_age: Int) = copy (age = _age)'. – Ghedeon

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