2012-06-26 21 views
264

मुहरबंद कक्षाओं को 'प्रोग्रामिंग इन स्कैला' में वर्णित किया गया है, लेकिन मुहरबंद लक्षण नहीं हैं। मुझे एक सीलबंद विशेषता के बारे में अधिक जानकारी कहां मिल सकती है?एक सीलबंद विशेषता क्या है?

मैं जानना चाहता हूं, अगर एक सीलबंद विशेषता एक मुहरबंद वर्ग के समान है? या, यदि नहीं, तो मतभेद क्या हैं? एक सीलबंद विशेषता (और जब नहीं) का उपयोग करना एक अच्छा विचार कब है?

उत्तर

42

daily-scala blog से:

जब एक विशेषता "सील" है इसके उपवर्गों के सभी एक ही फ़ाइल में घोषित किया गया है और कहा कि परिमित उपवर्गों जो कुछ संकलक चेकों की अनुमति देता है के सेट बनाता है।

+0

धन्यवाद। "इसके सभी उप-वर्गों" के साथ इसका मतलब वर्ग और गुण है? –

+1

डाउनवॉटेड क्यों? –

+0

@ जॉन - मैंने कोशिश नहीं की है, लेकिन मुझे कक्षाओं पर संदेह है। सीलिंग के बारे में बात यह है कि सब कुछ उस स्रोत इकाई –

354

एक sealed विशेषता केवल अपने घोषणा के रूप में एक ही फाइल में बढ़ाया जा सकता है।

अक्सर उन्हें enums का विकल्प प्रदान करने के लिए उपयोग किया जाता है। चूंकि उन्हें केवल एक फ़ाइल में ही बढ़ाया जा सकता है, इसलिए संकलक हर संभव उपप्रकार जानता है और इसके बारे में कारण बता सकता है।

घोषणा के साथ उदाहरण के लिए:

sealed trait Answer 
case object Yes extends Answer 
case object No extends Answer 

संकलक एक चेतावनी फेंकना होगा अगर एक मैच संपूर्ण नहीं है:

scala> val x: Answer = Yes 
x: Answer = Yes 

scala> x match { 
    | case No => println("No") 
    | } 
<console>:12: warning: match is not exhaustive! 
missing combination   Yes 

तो तुम सील का उपयोग करना चाहिए लक्षण (या सील सार वर्ग) अगर संभावित उपप्रकारों की संख्या सीमित है और अग्रिम में ज्ञात है। अधिक उदाहरणों के लिए आप list और option कार्यान्वयन पर एक नज़र डाल सकते हैं।

+78

मुझे यादृच्छिक रूप से यहां आने के लिए छह महीने लग गए और स्कैला में जावा एनम को बदलने के तरीके को समझ लिया। – sscarduzio

77

एक सीलबंद विशेषता एक मुहरबंद कक्षा के समान है?

जहां तक ​​sealed चला जाता है, हाँ। वे trait और class के बीच सामान्य अंतर साझा करते हैं।

या, यदि नहीं, तो मतभेद क्या हैं?

म्यूट।

एक सीलबंद विशेषता (और कब नहीं) का उपयोग करना एक अच्छा विचार कब है?

आप एक sealed class X है, तो आप X साथ ही किसी भी उपवर्गों की जांच करने के लिए है। यह sealed abstract class X या sealed trait X के बारे में भी सच नहीं है। तो आप sealed abstract class X कर सकते हैं, लेकिन यह trait की तुलना में और अधिक लाभ के लिए और अधिक verbose है।

का उपयोग trait पर करने का मुख्य लाभ यह है कि यह पैरामीटर प्राप्त कर सकता है। टाइप क्लास का उपयोग करते समय यह लाभ विशेष रूप से प्रासंगिक होता है। मान लीजिए कि आप एक क्रमबद्ध पेड़ बनाना चाहते हैं, उदाहरण के लिए।आप यह लिख सकते हैं:

sealed abstract class Tree[T : Ordering] 

लेकिन यदि आप ऐसा नहीं कर सकते हैं:

sealed trait Tree[T : Ordering] 

संदर्भ सीमा (और देखने सीमा) के बाद से अंतर्निहित मानकों के साथ लागू किया जाता है। यह देखते हुए कि लक्षण पैरामीटर प्राप्त नहीं कर सकते हैं, आप ऐसा नहीं कर सकते हैं।

व्यक्तिगत रूप से, मैं sealed trait पसंद करता हूं और इसका उपयोग तब तक करता हूं जब तक कि कोई विशेष कारण मुझे sealed abstract class का उपयोग नहीं करता है। और मैं सूक्ष्म कारणों के बारे में बात नहीं कर रहा हूं, लेकिन आपके सामने के कारणों से आप अनदेखा नहीं कर सकते हैं, जैसे टाइप क्लासेस का उपयोग करना।

+0

"क्योंकि संदर्भ सीमाएं (और सीमाएं देखें) अंतर्निहित मानकों के साथ कार्यान्वित की जाती हैं।" - क्या आप इसे विस्तार से समझा सकते हैं? – Ruby

22

इसके अलावा, मैं विनिर्देशों के लिए आप बात करने के लिए की जरूरत महसूस:

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

- M. Odersky. The Scala language specification, version 2.8. online, Sept., 2013.

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