2017-08-03 33 views
5

tôi là một nhà phát triển Java Android và tôi đang tiếp cận để KotlinAndroid Kotlin mở rộng siêu gọi

tôi đã xác định các lớp sau đây:

open class Player : RealmObject() { 
    ... 
} 

Và tôi xác định hai phần mở rộng sau, một cho lớp RealmObject chung và một cho lớp Player cụ thể:

fun RealmObject.store() { 
    Realm.getDefaultInstance().use { realm -> 
     realm.beginTransaction() 
     realm.copyToRealmOrUpdate(this) 
     realm.commitTransaction() 
    } 
} 

fun Player.store(){ 
    this.loggedAt = Date() 
    (this as RealmObject).store() 
} 

gì tôi muốn là nếu tôi gọi .store() trên bất kỳ RealmObject đối tượng, t anh ta RelamObject.store() tiện ích mở rộng sẽ được gọi là NHƯNG nếu tôi gọi số .store() trên một ví dụ Player mà tiện ích sẽ được gọi là Player.store(). (Không vấn đề gì bây giờ) Tôi không muốn sao chép dán cùng một mã, tôi thích viết ít sử dụng lại nhiều hơn. Vì vậy, tôi cần nội bộ số Player.store() sẽ gọi cho số RealmObject.store()

mới nhất của tôi. Mã tôi đã viết lên đó được thực sự làm việc như mong đợi: D

gì tôi đang hỏi là (chỉ vì tôi đã viết rằng chỉ bằng cách đích thân trực giác):

Đây có phải là cách tốt ?! Hoặc có một số cách tốt hơn?

Cảm ơn bạn

+0

Nếu mã hoạt động đúng và những gì bạn muốn là một xem xét mã hoặc cách tốt hơn để thực hiện tác vụ này, bạn nên truy cập [Đánh giá mã] (https://codereview.stackexchange.com/) và đăng sự nghi ngờ này lên đó. –

Trả lời

2

cách tiếp cận của bạn có vẻ là hoàn toàn chính xác, bởi vì nó thực hiện chính xác những gì cần thiết. Kotlin giải quyết các cuộc gọi mở rộng dựa trên loại static (được phỏng đoán hoặc được khai báo) của biểu thức người nhận và dàn diễn viên (this as RealmObject) làm cho loại biểu thức tĩnh RealmObject.

Một cách hợp lệ để làm điều này, điều mà tôi không chắc chắn là tốt hơn, là sử dụng một tài liệu tham khảo có thể được gọi để phần mở rộng khác:

fun Player.store(){ 
    this.loggedAt = Date() 
    (RealmObject::store)(this) 
} 
Các vấn đề liên quan