2014-10-18 9 views
41

डेटा कक्षाएं जावा में पुराने-पुराने पीओजेओ के प्रतिस्थापन प्रतीत होती हैं। यह काफी उम्मीद है कि ये वर्ग विरासत की अनुमति देंगे, लेकिन मैं डेटा वर्ग का विस्तार करने का कोई सुविधाजनक तरीका नहीं देख सकता हूं।कोटलिन में डेटा क्लास बढ़ाएं

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

कोड ऊपर component1() तरीकों में से टकराव के कारण विफल रहता: क्या मैं जरूरत है कुछ इस तरह है। कक्षाओं में से केवल एक में data एनोटेशन छोड़ने से काम भी नहीं होता है।

शायद डेटा वर्गों का विस्तार करने के लिए एक और मुहावरे है?

यूपीडी: मैं केवल बाल बाल वर्ग को एनोटेट कर सकता हूं, लेकिन data एनोटेशन केवल कन्स्ट्रक्टर में घोषित संपत्तियों को संभालता है। जो है, मैं सभी माता पिता के गुण open घोषित करने और ओवरराइड उन्हें, जो बदसूरत है करने के लिए होगा:

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

क्या घटक 1 ??? – maaartinus

+0

कोटलिन स्पष्ट रूप से विधियों 'घटक एन() 'बनाता है जो एन-वें संपत्ति का वापसी मूल्य। [मल्टी-घोषणाओं] पर दस्तावेज़ देखें (http://kotlinlang.org/docs/reference/multi-declarations.html) – Dmitry

+0

गुणों को खोलने के लिए, आप संसाधन सार तत्व भी बना सकते हैं या कंपाइलर प्लगइन का उपयोग कर सकते हैं। कोटलिन खुले/बंद सिद्धांत के बारे में सख्त है। –

उत्तर

33

सत्य है: डेटा वर्गों विरासत के साथ बहुत अच्छी तरह नहीं खेलते हैं। हम डेटा वर्गों की विरासत को प्रतिबंधित या गंभीर रूप से सीमित करने पर विचार कर रहे हैं। उदाहरण के लिए, यह ज्ञात है कि गैर-सारणी कक्षाओं पर पदानुक्रम में equals() को सही ढंग से कार्यान्वित करने का कोई तरीका नहीं है।

तो, मैं बस पेशकश कर सकता हूं: डेटा कक्षाओं के साथ विरासत का उपयोग न करें।

+0

हे एंड्री, डेटा वर्गों पर अब जेनरेट किए जाने के बराबर() कैसे काम करता है? क्या यह केवल तभी मेल खाता है जब प्रकार सटीक है और सभी सामान्य फ़ील्ड बराबर हैं, या केवल तभी फ़ील्ड बराबर हैं? यह बीजगणितीय डेटा प्रकारों को अनुमानित करने के लिए वर्ग विरासत के मूल्य की वजह से प्रतीत होता है, यह इस समस्या के समाधान के साथ आने लायक हो सकता है। दिलचस्प बात यह है कि मार्टिन ओडर्स्की द्वारा इस विषय पर एक सरसरी खोज ने इस चर्चा को प्रकट किया: http://www.artima.com/lejava/articles/equality.html – orospakr

+1

मुझे विश्वास नहीं है कि इस समस्या का समाधान बहुत अधिक है। मेरी राय अब तक है कि डेटा वर्गों में डेटा-सबक्लास बिल्कुल नहीं होना चाहिए। –

+1

क्या होगा यदि हमारे पास कुछ ओआरएम जैसे लाइब्रेरी कोड हैं और हम अपने मॉडल को अपने सतत डेटा मॉडल के लिए विस्तारित करना चाहते हैं? –

18

कन्स्ट्रक्टर के बाहर सुपर-क्लास में गुणों को सार के रूप में घोषित करें, और उन्हें उप-वर्ग में ओवरराइड करें।

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

यह सबसे लचीला प्रतीत होता है। मुझे बहुत इच्छा है कि हम डेटा कक्षाओं को एक-दूसरे से प्राप्त कर सकें, हालांकि ... – Adam

+0

यह सबसे अच्छा तरीका है –

संबंधित मुद्दे