मुझे लगता है कि वस्तु-उन्मुख अवधारणाओं को लागू करने के लिए सी पूरी तरह से ठीक और सभ्य है, श्रग । अधिकांश अंतर जैसा कि मैं इसे देखता हूं कि वस्तु-उन्मुख मानी जाने वाली भाषाओं के आम भाजक सबसेट के बीच मेरी तरह के व्यावहारिक दृष्टिकोण से मामूली और वाक्यविन्यास हैं।
आइए, जानकारी छिपाने के साथ शुरू करते हैं। सी में हम एक संरचना की परिभाषा को छिपाकर और अपारदर्शी बिंदुओं के माध्यम से इसके साथ काम करके प्राप्त कर सकते हैं। यह प्रभावी रूप से डेटा फ़ील्ड्स के public
बनाम private
अंतर को मॉडल करता है जैसा कि हम कक्षाओं के साथ प्राप्त करते हैं। और यह करना काफी आसान है और मुश्किल से विरोधी मुहावरे के रूप में, मानक सी लाइब्रेरी जानकारी छुपाने के लिए इस पर बहुत अधिक निर्भर करती है।
बेशक आप आसानी से नियंत्रण करने की क्षमता खो देते हैं जहां संरचना को अपारदर्शी प्रकारों का उपयोग करके स्मृति में आवंटित किया जाता है, लेकिन यह केवल सी और सी ++ के बीच का उल्लेखनीय अंतर है। C ++ निश्चित रूप से एक बेहतर उपकरण है, जो मेमोरी लेआउट पर नियंत्रण बनाए रखते हुए C पर ऑब्जेक्ट-ओरिएंटेड अवधारणाओं को प्रोग्राम करने की अपनी क्षमता की तुलना करता है, लेकिन इसका मतलब यह नहीं है कि जावा या C # उस संबंध में C से बेहतर है, क्योंकि वे दोनों आपको बनाते हैं। पूरी तरह से नियंत्रण करने की क्षमता खो दें जहां वस्तुओं को स्मृति में आवंटित किया जाता है।
और हमें एक सिंटैक्स का उपयोग करना होगा, लेकिन इसके fopen(file, ...); fclose(file);
विपरीत जो file.open(...); file.close();
बड़ा है। असल में किसे परवाह है? हो सकता है कि कोई व्यक्ति जो अपनी आईडीई में ऑटो-पूर्ति पर भारी पड़े। मैं मानता हूं कि यह एक व्यावहारिक दृष्टिकोण से एक बहुत ही उपयोगी विशेषता हो सकती है, लेकिन शायद कोई ऐसा नहीं है जो इस बात पर चर्चा करता है कि क्या कोई भाषा ओओपी के लिए उपयुक्त है।
हमारे पास protected
खेतों को प्रभावी ढंग से लागू करने की क्षमता की कमी है । मैं पूरी तरह वहाँ जमा करूँगा। लेकिन मुझे नहीं लगता कि कोई ठोस नियम है जो कहता है, " सभी ओओ भाषाओं में एक बेस क्लास के सदस्यों तक पहुँचने के लिए उपवर्गों की अनुमति देने की सुविधा होनी चाहिए जो अभी भी सामान्य ग्राहकों द्वारा एक्सेस नहीं की जानी चाहिए ।" इसके अलावा मैं शायद ही कभी संरक्षित सदस्यों के लिए उपयोग के मामले देखता हूं जो रखरखाव बाधा बनने के कम से कम कुछ संदिग्ध नहीं हैं।
और निश्चित रूप से हमें उन अनुरूप vtables
और प्रारंभिक को समायोजित करने के लिए थोड़ा और अधिक बॉयलरप्लेट के साथ गतिशील प्रेषण के लिए ओओ बहुरूपता के साथ उन्हें "इंगित" करना है vptrs
, लेकिन बॉयलरप्लेट का थोड़ा सा भी मुझे बहुत दुःख नहीं है।
वंशानुक्रम वैसे ही बहुत है। हम आसानी से मॉडल कर सकते हैं कि रचना के माध्यम से, और संकलक के आंतरिक कामकाज में यह एक ही चीज को उबालता है। यदि हम डाउनकास्ट करना चाहते हैं , तो निश्चित रूप से हम टाइप सुरक्षा खो देते हैं , और मैं कहूंगा कि यदि आप डाउनकास्टिंग होना चाहते हैं , तो कृपया इसके लिए C का उपयोग न करें, क्योंकि डाउन सीटिंग का अनुकरण करने के लिए लोग सी में जो चीजें करते हैं, वह एक प्रकार से भीषण हो सकती है। सुरक्षा के दृष्टिकोण, लेकिन मैं बल्कि लोगों को बिल्कुल भी नहीं रोकना चाहता । टाइप सेफ्टी एक ऐसी चीज है जिसे आप आसानी से सी में मिस करना शुरू कर सकते हैं क्योंकि कंपाइलर चीजों को सिर्फ बिट्स और बाइट्स की व्याख्या करने के लिए इतना अधिक मार्ग प्रदान करता है, जो संकलन-समय पर त्रुटियों को पकड़ने की क्षमता का त्याग करता है, लेकिन कुछ भाषाओं को ऑब्जेक्ट-ओरिएंटेड माना जाता है 'सांख्यिकीय रूप से भी टाइप नहीं किया गया है।
तो डननो, मुझे लगता है कि यह ठीक है। बेशक, मैं बड़े पैमाने के कोडबेस बनाने की कोशिश करने के लिए सी का उपयोग नहीं करूंगा जो एसओएलआईडी सिद्धांतों के अनुरूप है, लेकिन जरूरी नहीं कि ऑब्जेक्ट-ओरिएंटेड फ्रंट में इसकी शॉर्ट-कॉमिंग के कारण हो। अगर मैं इस तरह के उद्देश्य के लिए सी का उपयोग करने का प्रयास करता हूं तो बहुत सारी सुविधाएं मुझे याद आती हैं, जो ओओपी के लिए प्रत्यक्ष रूप से आवश्यक नहीं मानी जाने वाली भाषा सुविधाओं जैसे मजबूत प्रकार की सुरक्षा, विध्वंसक जो स्वचालित रूप से आह्वान किए जाते हैं जब ऑब्जेक्ट दायरे से बाहर चले जाते हैं, ऑपरेटर ओवरलोडिंग, टेम्प्लेट / जेनरिक और अपवाद-हैंडलिंग। यह तब है जब मैं उन सहायक विशेषताओं को याद कर रहा हूं जो मैं C ++ के लिए पहुंचता हूं।