2011-08-29 11 views
17

यह काम नहीं करता:एक विशेषता विरासत में दो बार

trait Trait 
class Class extends Trait with Trait 

संकलक शिकायत:

<console>:8: error: trait Trait is inherited twice 
     class Class extends Trait with Trait 
         ^
<console>:8: error: trait Trait is inherited twice 
     class Class extends Trait with Trait 
            ^

यह करता है:

trait Trait 
class Abstraction extends Trait 
class Implementation extends Abstraction with Trait 

सवाल:

  • डब्ल्यू हाय यह काम करता है?
  • दूसरा स्निपेट अलग कैसे है? (डबल विरासत मुद्दे के बारे में)
  • क्या दूसरा स्निपेट या पैटर्न किसी भी तरह उपयोगी है?
+0

क्या आपके पास एक व्यावहारिक उदाहरण है जहां यह वास्तविक समस्या है कि पहला काम नहीं करता है? – Jesper

+1

प्रश्न का उद्देश्य यह नहीं पता कि पहला व्यक्ति क्यों काम नहीं करता है, बल्कि दूसरा क्यों करता है। – agilesteel

+1

उपयोगी लिंक: [स्कैला में प्रोग्रामिंग से अध्याय] (http://www.artima.com/pins1ed/traits.html#i-1280910181-1) दिखाता है कि रैखिकरण कैसे काम करता है। – 4e6

उत्तर

19

दूसरा स्निपेट विशेषता रैखिकरण के कारण काम करता है। कंपाइलर गुणों को रैखिक सूची में व्यवस्थित करेगा ताकि Trait केवल एक बार दिखाई दे। मुझे लगता है कि linearization है

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any 

एक महान विवरण के लिए प्रोग्रामिंग स्काला से this chapter देखें।

यह मुख्य रूप से हीरा विरासत की समस्या के लिए एक सतत दृष्टिकोण रखने के लिए किया जाता है और उस मामले में उपयोगी होता है।

के बाद से Trait दो बार linearization के बाद प्रकट नहीं कर सकते हैं, यह भावना Trait with Trait लिखने के लिए नहीं है और यह भावना अनुमति नहीं है।

+0

उत्तर बहुत पुराना है इसलिए शायद स्कैला ने इस व्यवहार को बदल दिया लेकिन मेरे लिए अभी ऐसा लगता है कि यह गलत है। रैखिकरण होना चाहिए: कार्यान्वयन, एब्स्ट्रक्शन, विशेषता, ... – kpbochenek

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