जहां, एक वस्तु उन्मुख प्रणाली में आपको, यदि सभी में, (सी-शैली) कक्षाओं पर संरचना का चयन करना चाहिए?


9

सी और सबसे अधिक संभावना है कि कई अन्य भाषाएं structसंरचनाएं बनाने के लिए एक कीवर्ड प्रदान करती हैं (या समान शैली में कुछ)। ये (कम से कम C में) कक्षाओं की तरह एक सरलीकृत दृष्टिकोण से हैं, लेकिन बहुरूपता, विरासत, तरीकों और इतने पर के बिना।

सी-शैली के ढांचे के साथ एक वस्तु-उन्मुख (या बहु प्रतिमान) भाषा के बारे में सोचें। आप उन्हें कक्षाओं में कहां चुनेंगे? अब, मुझे विश्वास नहीं है कि उनका उपयोग ओओपी के साथ किया जाना है क्योंकि कक्षाएं उनके उद्देश्यों को बदलने के लिए प्रतीत होती हैं, लेकिन मुझे आश्चर्य है कि क्या ऐसी परिस्थितियां हैं जहां उन्हें कक्षाओं पर प्राथमिकता दी जा सकती है अन्यथा ऑब्जेक्ट-ओरिएंटेड प्रोग्राम और किस तरह की स्थितियों में। क्या ऐसे हालात हैं?


आप किस भाषा का उपयोग कर रहे हैं? आप क्या प्रकाशित कर रहे हैं? जावा को छोड़कर अधिकांश आधुनिक OO भाषाएँ, एक या दूसरे तरीके से गुणों का समर्थन करती हैं।
केविन क्लाइन

जवाबों:


16

राज्य-ले जाने वाली वस्तुओं और कार्यक्षमता प्रदान करने वाली वस्तुओं के बीच कुछ पुस्तकों में मैंने देखा है कि एक अंतर है। स्रोत से स्रोत तक सटीक शब्द भिन्न होते हैं। लेकिन आम तौर पर बोलते हुए, पूर्व को खेतों के एक समूह और साधारण गेटर्स-बसने वाले जोड़े (और शायद एक निर्माता) के पूरे झुंड के द्वारा प्रतिष्ठित किया जाता है।

ये जावा में विशेष रूप से सामान्य हैं, उन वर्गों के लिए जिन्हें स्पष्ट रूप से "क्रमबद्ध" के रूप में चिह्नित किया गया है।

मेरा तर्क है कि इस प्रकार की कक्षाएं सबसे अधिक समझ में आती हैं, अगर आपको लगता है कि सदस्यों को सीधे छिपाने की आवश्यकता नहीं है (उदाहरण के लिए, नेस्टेड प्रकारों के मामले में)।


1
रॉबर्ट सी मार्टिन उन्हें क्लीन कोड में "डेटा ट्रांसफर ऑब्जेक्ट्स" कहते हैं ।
user16764

5

सी में, कोई वर्ग नहीं हैं, इसलिए structडेटा को बंडल करने का तरीका है। C ++ में, structएक ही रूप है class, सिवाय इसके कि विरासत और सदस्य पहुँच है publicबजाय डिफ़ॉल्ट रूप से private। C # का भी एक प्रकार है struct, लेकिन मुझे इस पर टिप्पणी करने के लिए पर्याप्त C # नहीं पता है। कॉमन लिस्प के पास वह defstructरूप है, जो structभाषा के अंतर को देखते हुए C के जितना काम करता है, उतना ही सामान्य है और यह कॉमन लिस्प ऑब्जेक्ट सिस्टम से अलग है।

हालाँकि, डेटा के एक संबंधित बंडल और वास्तविक वर्ग के बीच एक वैचारिक अंतर है, और C ++ structमें अक्सर डेटा के एक बंडल के classलिए उपयोग किया जाता है , जबकि उन वस्तुओं के लिए उपयोग किया जाता है जिनके पास अपना व्यवहार होना चाहिए। एक दिशानिर्देश के रूप में, मैं कहूंगा कि एक classऐसी चीज़ का प्रतिनिधित्व करता है जिसके बारे में आप कुछ उपयोगी कह सकते हैं, जैसे कि एक वर्ग अपरिवर्तनीय, जबकि structडेटा मानों के साथ अधिक शिथिल रूप से जोड़ा जाएगा जो वास्तव में अन्य लोगों पर बहुत अधिक निर्भर नहीं करता है।


6
C # में a structऔर a classका अंतर अधिक महत्वपूर्ण है - बड़ी बात यह है कि structएक मान प्रकार है और classएक संदर्भ प्रकार है। Microsoft अनुशंसा करता है कि structयदि सामग्री 16 बाइट्स या उससे बड़ी होगी, तो उसका उपयोग न करें।
कार्सॉन 63000

0

एक बहुत ही बुनियादी स्तर पर एक संरचना और एक शुद्ध डेटा वर्ग के बीच अंतर क्या है (जिसमें संपत्ति एक्सेसरों के अलावा कोई कार्यक्षमता नहीं है)?

स्मृति पदचिह्न वास्तव में कुछ भी नहीं है।


0

स्वीकृत उत्तर अच्छा है। मैं बस जोड़ना चाहूंगा ...।

कभी-कभी एक कक्षा के अंदर एक विधि डालना बेहतर होता है। अन्य समय में एक बाहरी कार्य करना बेहतर होता है जहां संरचना / वर्ग को एक पैरामीटर के रूप में पारित किया जाता है (भले ही आप ओओपी शैली कर रहे हों)।

कक्षा के अंदर कोई विधि डालने का उदाहरण: Rectangle.CaclulateArea ()

क्लास के बाहर फंक्शन लगाने का उदाहरण: Canvas.Draw (आयत आयत)

आप आयत के अंदर ड्रा () लगा सकते हैं और यह काम करेगा। लेकिन ड्राइंग एक टियर डिपेंडेंट ऑपरेशन है। आप सर्वर की तरफ नहीं, बल्कि क्लाइंट की तरफ आकर्षित होंगे। ड्रा () से सर्वर पर मौजूद होने का भी कोई मतलब नहीं होगा। हालांकि "कैलक्लेटअरेआ ()" टियर से स्वतंत्र है और आयत की एक सच्ची विशेषता है, इसलिए इसे एक सदस्य विधि के रूप में शामिल करना बेहतर है।


0

मेरे लिए, बड़ा अंतर यह है कि क्या एक वर्ग-अपरिवर्तनीय है या नहीं।

या दूसरे शब्दों में: क्या मैं किसी भी समय किसी भी क्षेत्र को किसी भी मूल्य पर बदलने के लिए स्वतंत्र हूं? यदि हां, तो यह एक संरचना है; यदि नहीं, तो यह एक वर्ग है।

एक संरचना का सामान्य उदाहरण एक 2 डी बिंदु है, जिसमें सिर्फ एक एक्स और वाई सदस्य है, जिसका कोई भी मूल्य हो सकता है और एक दूसरे से पूरी तरह से स्वतंत्र हैं। सार्वजनिक पहुंच स्वीकार्य है।

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


0

1) नेटवर्क structs: संरचनाएं जो तार पर संचारित होती हैं।

आम तौर पर और औपचारिक रूप से, कोई भी वर्ग जिसे आपको POD, तुच्छ, मानक-लेआउट या संबंधित अवधारणा की आवश्यकता होती है। इन अवधारणाओं की उत्कृष्ट चर्चा के लिए, उदाहरणों के साथ, इस उत्तर को देखें (यह C ++ 11 के लिए है)।

2) फ़ंक्शंस (विशेष रूप से भविष्यवाणी), कि आप जैसे कार्यों को पूरा करेंगे std::remove_if। अन्यथा, वर्गों को / से std::binary_functionया जैसी विरासत में मिला / विरासत में मिला ।

3) मेटा-प्रोग्रामिंग अवधारणाएं, जिसमें केवल सार्वजनिक constexprs और / या typedefs शामिल हो सकते हैं ।

संपादित करें: नोट: यह उत्तर C ++ कक्षाओं बनाम संरचना पर लागू होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.