2011-12-12 11 views
7

उदाहरण के लिए यदि मेरे पास दो अलग-अलग रिकॉर्ड हैं, लेकिन वे कुछ सामान्य क्षेत्रों को साझा करते हैं, तो दोनों रिकॉर्ड एक सामान्य आधार रिकॉर्ड साझा करने का कोई तरीका है? ऐसा लगता है जैसे प्रोटोकॉल केवल विधि हस्ताक्षर घोषित करने की अनुमति देते हैं।क्लोजर में डेटाटाइप विरासत करना संभव है?

+0

कि दो संस्थाएं कुछ क्षेत्रों को साझा करती हैं, उनके बीच विरासत संबंध बनाने के लिए वास्तव में पर्याप्त कारण नहीं है। शायद कुछ उदाहरण उपयोग परिदृश्य प्रदान करते हैं। –

+1

उदाहरण के लिए, मैं पार्स किए गए SQL-query का प्रतिनिधित्व करने के लिए रिकॉर्ड का उपयोग कर रहा हूं। तो मेरे पास चयन, अद्यतन, INSERT, आदि के लिए रिकॉर्ड हैं .. वे कुछ सामान्य गुणों को साझा करते हैं, जैसे 'स्ट्रिंग' संपत्ति। जब मैं पॉलिमॉर्फिक कार्यों का उपयोग करके उनके साथ काम करता हूं, तो मैं सुनिश्चित करना चाहता हूं कि उनके पास कुछ सामान्य गुण हैं। – Chris

+1

रिकॉर्ड्स केवल फैंसी मैप्स हैं, इसलिए मैं स्पष्ट नहीं हूं कि इसका अर्थ यह है कि "सभी के पास कुछ सामान्य गुण हैं"। आप केवल '(: स्ट्रिंग ए-रिकॉर्ड) क्यों नहीं कॉल कर सकते हैं? साथ ही, रिकॉर्ड के कुंजियों का सेट उन व्यवहारों से अलग मुद्दा हो सकता है जो ठोस प्रकार व्यक्त कर सकते हैं। आप हल करने की कोशिश कर रहे वास्तविक समस्या क्या है? –

उत्तर

3

मुझे नहीं लगता कि अब तक संभव है।

defrecord सिर्फ एक मैक्रो है और आप macroexpand, की तरह कुछ का उपयोग करके जांच कर सकते हैं कि वह क्या करता है: यदि आप इस तरह के रिकॉर्ड विरासत आप शायद ऐसा करने के लिए कोई मैक्रो लागू करने की आवश्यकता चाहते

(macroexpand '(defrecord User [Name Age])) 

तो। लेकिन मैं यह सुझाव नहीं दूंगा कि विरासत ऐसा कुछ है जिसे मैं टालने की कोशिश करता हूं क्योंकि इससे जटिलता होती है।

3

आपको एक अवशोषण के खिलाफ प्रोग्रामिंग होना चाहिए, विशेष फ़ील्ड नहीं, यानी, प्रोटोकॉल का उपयोग करें ताकि रिकॉर्ड एक सामान्य इंटरफ़ेस साझा कर सकें। उदाहरण के लिए, यदि आपके सभी रिकॉर्ड प्रकारों को 'स्ट्रिंग' प्रॉपर्टी वापस करने की आवश्यकता है, तो 'get-string' विधि के साथ प्रोटोकॉल बनाएं और प्रत्येक रिकॉर्ड प्रकार को बढ़ाएं।

(defprotocol SQL 
    (get-string [t])) 

(defrecord Thing [name f1 f2] 
    SQL 
    (get-string [t] (str name))) 

(defrecord AnotherThing [name f1 f2 f3 f4 blah] 
    SQL 
    (get-string [t] (str name))) 

यदि आप पाते हैं अपने आप को एक विशेष प्रोटोकॉल विधि आप हमेशा 'defn-' (गैर-सार्वजनिक समारोह) कार्यान्वयन कर सकते हैं के लिए एक ही कार्यान्वयन बनाकर प्रत्येक रिकॉर्ड प्रकार में कार्यान्वयन के रूप में उपयोग।

+1

क्या होगा यदि मैं एक रिकॉर्ड बनाना चाहता हूं जो किसी अन्य रिकॉर्ड के कुछ फ़ील्ड साझा करता हो? जैसे: (defrecord a [ba bc]) (defrecord b [ba bc bd] .. ऐसे मामले को कैसे निपटें? –

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