2011-09-28 17 views
11

मैं स्काला का एक बेहतर समझ पाने के लिए कोशिश कर रहा हूँ, और मैं निम्नलिखित की तरह कोड के लिए एक वैध USECASE खोजने के लिए प्रतीत नहीं कर सकते हैं:स्कैला में एक अनाम प्रकार का विस्तार करने का उद्देश्य क्या है?

class C extends { def m() { /* ... */ } } 

इस तरह के निर्माणों अनुमति देने के लिए औचित्य क्या है?

धन्यवाद!

+2

आपके द्वारा दिया गया उदाहरण एक संरचनात्मक प्रकार नहीं है, बल्कि एक अज्ञात वर्ग है। ऐसा नहीं है कि यह बताता है कि आप इसे क्यों बढ़ा सकते हैं ... –

+0

ठीक है आप, मैंने – Eyvind

उत्तर

12

मुझे लगता है कि यहां एकमात्र तर्क है "यदि संभव हो तो विशेष मामलों से बचें"। आप किसी भी वर्ग का विस्तार कर सकते हैं, एक अज्ञात वर्ग एक वर्ग है, इसलिए आप एक अज्ञात वर्ग का विस्तार कर सकते हैं।

+0

शीर्षक अपडेट किया है आप शायद सही (+1) हैं। वास्तविक उपयोग केस से प्यार होगा, हालांकि, अगर कोई वास्तव में मौजूद है :) – Eyvind

+1

मुझे नहीं लगता कि एक है ... –

+0

मैं किम से सहमत हूं, विरासत में व्यवहार साझा करने या किसी दिए गए पदानुक्रम का प्रतिनिधित्व करने की अनुमति मिलती है। लेकिन यदि अज्ञात में अभिभावक वर्ग है, तो आपके पास एक ही मूल वर्ग को विस्तारित करने वाले दो बच्चे वर्ग नहीं हो सकते हैं। – paradigmatic

11

वास्तव में, यह एक अज्ञात वर्ग नहीं है! यह प्रारंभिक प्रारंभकर्ता है और यह कन्स्ट्रक्टर के हिस्से के रूप में चलता है जो इसके सुपरक्लास से पहले चला जाता है। ,

abstract class X { 
    val name: String 
    val size = name.size 
} 

class Y extends { 
    val name = "class Y" 
} with X 

तो कोड के रूप में

class Z extends X { 
    val name = "class Z" 
} 

बजाय लिखा गया था तो एक नल पॉइंटर एक्सेप्शन घटित होता है जब जेड प्रारंभ हो गया क्योंकि आकार सामान्य में नाम से पहले आरंभ नहीं हो जाता: another stackoverflow question से उत्कृष्ट जवाब का हवाला देते हुए प्रारंभिकरण (कक्षा से पहले सुपरक्लास) का आदेश।

1

इसे Early definitions कहा जाता है और वे सुपर क्लास प्रारंभिक आदेश समस्या से निपटते हैं।