Swift में open कीवर्ड: यह क्या है और शुरुआती लोगों को इसकी आवश्यकता क्यों है

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift में open कीवर्ड क्या छुपाता है? शुरुआती लोगों के लिए विश्लेषण

\n\n

क्या आपने कभी Swift में एक क्लास लिखा, उसमें public जोड़ा, और फिर दूसरे मॉड्यूल में उससे इनहेरिट करने की कोशिश की — और कंपाइलेशन एरर मिली? यदि हाँ, तो आप अकेले नहीं हैं। यह प्रश्न शुरुआती Swift डेवलपर्स के बीच Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है। हज़ारों लोग एक ही पत्थर से ठोकर खाते हैं: open कीवर्ड।

\n\n

इस लेख में हम एक बार और हमेशा के लिए समझेंगे कि Swift में open क्या है, यह public से कैसे अलग है, इसका उपयोग कब करना चाहिए, और कब बिल्कुल नहीं करना चाहिए। हम वास्तविक कोड लिखेंगे, त्रुटियों को देखेंगे और उन्हें ठीक करना सीखेंगे। चलिए शुरू करते हैं!

\n\n

Swift में एक्सेस मॉडिफायर सिस्टम: एक संक्षिप्त परिचय

\n\n

open में गोता लगाने से पहले, आइए याद करें कि Swift में एक्सेस लेवल कितने प्रकार के होते हैं। पाँच हैं (सबसे बंद से सबसे खुले तक):

\n\n
    \n
  • private — केवल एक फ़ाइल और एक घोषणा के अंदर उपलब्ध (उदाहरण के लिए, एक क्लास के अंदर)।
  • \n
  • fileprivate — पूरी फ़ाइल के भीतर उपलब्ध।
  • \n
  • internal — पूरे मॉड्यूल के भीतर उपलब्ध (यह डिफ़ॉल्ट स्तर है)।
  • \n
  • public — अन्य मॉड्यूल से उपलब्ध, लेकिन इनहेरिट और ओवरराइड नहीं किया जा सकता।
  • \n
  • open — अन्य मॉड्यूल से उपलब्ध, इनहेरिट और ओवरराइड किया जा सकता है।
  • \n
\n\n

मुख्य रहस्य public और open के बीच के अंतर में है। पहली नज़र में वे समान लगते हैं: दोनों दूसरे मॉड्यूल से क्लास, मेथड या प्रॉपर्टी तक पहुँचने की अनुमति देते हैं। लेकिन एक मूलभूत अंतर है, जिसे हम अब उदाहरणों के साथ समझेंगे।

\n\n

उदाहरण: एक public क्लास जिसे विस्तारित नहीं किया जा सकता

\n\n

कल्पना करें कि आप नेटवर्किंग के लिए एक लाइब्रेरी (फ्रेमवर्क) लिख रहे हैं। आप एक क्लास NetworkService बनाते हैं और इसे public बनाते हैं:

\n\n
// मॉड्यूल: MyNetworkingFramework\npublic class NetworkService {\n    public func fetchData() {\n        print("Fetching data from network...")\n    }\n}
\n\n

अब एक अन्य डेवलपर आपके फ्रेमवर्क को कनेक्ट करता है और उसके आधार पर अपनी बेहतर क्लास बनाना चाहता है:

\n\n
// मॉड्यूल: MyApp\nimport MyNetworkingFramework\n\n// त्रुटि! Cannot inherit from a public class\nclass MyNetworkService: NetworkService {\n    override func fetchData() {\n        print("My custom fetching...")\n    }\n}
\n\n

कंपाइलर एक त्रुटि देगा। क्यों? क्योंकि public दूसरे मॉड्यूल से केवल पढ़ने की पहुँच है। आप क्लास के इंस्टेंस का उपयोग कर सकते हैं, उसके मेथड को कॉल कर सकते हैं, लेकिन उससे इनहेरिट नहीं कर सकते। यह जानबूझकर किया गया है: लाइब्रेरी का लेखक नियंत्रित करना चाहता है कि किन क्लास को विस्तारित किया जा सकता है और किन्हें नहीं।

\n\n

समाधान: open का उपयोग करें

\n\n

यदि लाइब्रेरी का लेखक इनहेरिटेंस की अनुमति देना चाहता है, तो उसे स्पष्ट रूप से open निर्दिष्ट करना होगा:

\n\n
// मॉड्यूल: MyNetworkingFramework\nopen class NetworkService {\n    open func fetchData() {\n        print("Fetching data from network...")\n    }\n}
\n\n

अब दूसरे मॉड्यूल में आसानी से इनहेरिट किया जा सकता है और मेथड को ओवरराइड किया जा सकता है:

\n\n
// मॉड्यूल: MyApp\nimport MyNetworkingFramework\n\nclass MyNetworkService: NetworkService {\n    override func fetchData() {\n        print("My custom fetching with extra logging...")\n        super.fetchData()\n    }\n}
\n\n

यही सब जादू है। open कीवर्ड मॉड्यूल के बाहर इनहेरिटेंस और ओवरराइडिंग की अनुमति है।

\n\n

open आर्किटेक्चर के लिए क्यों महत्वपूर्ण है?

\n\n

Swift और Apple के डेवलपर्स ने यह अंतर बिना कारण नहीं बनाया। यह स्थिर और सुरक्षित API डिज़ाइन करने में मदद करता है। कल्पना करें कि आप एक लाइब्रेरी जारी करते हैं, और उसमें सभी क्लास open हैं।

ब्लॉग

पुस्तक अनुशंसाएँ