2010-06-13 16 views

उत्तर

74

अंतर यह है कि एक सीलबंद वर्ग के सभी उप-वर्ग (चाहे वह सार है या नहीं) मुहरबंद वर्ग के समान फ़ाइल में होना चाहिए।

+28

कुछ इतना स्पष्ट नहीं है (कम से कम यह मेरे लिए नहीं था :-)) यह है कि मुहरबंद वर्ग का "भव्य बच्चा" अन्य फाइलों में भी हो सकता है: मुहरबंद वर्ग ए दिया गया; बी ए बढ़ाता है; सी विस्तार करता है बी बी एक ही फाइल में ए के रूप में होना चाहिए, लेकिन सी उसी में या दूसरे में छोड़ सकता है। –

+6

@ सांडोरमुराकोज़ी आपको बी को एक मुहरबंद कक्षा के रूप में घोषित करना होगा, अगर आप इसे प्राप्त करना चाहते हैं। सीलिंग केवल प्रत्यक्ष विरासत से संबंधित है। – natbusa

71

answered के रूप में, सभी सीधे एक सीलबंद वर्ग (सार या नहीं) के उप-वर्गों को विरासत में मिलाकर एक ही फ़ाइल में होना चाहिए। इसका एक व्यावहारिक परिणाम यह है कि यदि संकलक मिलान अपूर्ण है तो संकलक चेतावनी दे सकता है। उदाहरण के लिए:

sealed abstract class Tree 
case class Node(left: Tree, right: Tree) extends Tree 
case class Leaf[T](value: T) extends Tree 
case object Empty extends Tree 

def dps(t: Tree): Unit = t match { 
    case Node(left, right) => dps(left); dps(right) 
    case Leaf(x) => println("Leaf "+x) 
    // case Empty => println("Empty") // Compiler warns here 
} 

Tree तो sealed है, तो संकलक चेतावनी दी है जब तक कि अंतिम पंक्ति uncommented है।

+0

कंपाइलर का अनुमान नहीं लगाया जा सकता है कि कोई सीलबंद' कीवर्ड नहीं है तो पैटर्न मिलान अपूर्ण है? –

+6

@ sasha.sochka मान लीजिए कि मैं इसे संकलित करता हूं और इसे 'सीलबंद' कीवर्ड के बिना एक जार फ़ाइल में डालता हूं। यह सब उस बिंदु पर संकलित किया गया है, जिसमें 'मैच' कथन शामिल है। अब, एक और उपयोगकर्ता इस जार को पकड़ता है और _ treeends 'Tree'_ करता है। ऐसा करने से उसे रोकने में कुछ भी नहीं है, लेकिन, उस बिंदु पर, 'मैच' कथन अब पूरा नहीं हुआ है। चूंकि वह इसे संकलित नहीं कर रहा है, बस इसे अपने जार से उपयोग कर रहा है, संकलक _him_ को चेतावनी नहीं दे सकता है। और चूंकि आपने जार बनाया जब आप इसे नहीं जानते थे, इसलिए यह आपको चेतावनी नहीं दे सका। –

+0

@DanielCSobral, आपने लिखा "लेकिन, उस * बिंदु पर, मैच स्टेटमेंट अब पूरा नहीं हुआ है"। * इस * पल पर मैच स्टेटमेंट अधूरा नहीं है, जब आप एक जार फ़ाइल बनाने से पहले, आपके द्वारा पोस्ट किए गए मूल कोड को संकलित करते हैं (लेकिन बिना 'सील किए गए' कीवर्ड के)? यह अनुमान लगाने में आसान लगता है, क्योंकि नए बच्चों के बिना भी (कंपाइलर अभी तक उनके बारे में नहीं जानता है) 'खाली' के लिए कोई शाखा नहीं है। और मैं उस व्यक्ति के लिए चेतावनी के बारे में बात कर रहा हूं जो एक जार बनाता है, न कि उस व्यक्ति के बारे में जो इसका उपयोग करता है। –

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