विंडोज फॉर्म / स्विंग फ्रेमवर्क संरचना के बजाय वंशानुक्रम का पक्ष क्यों लेते हैं?


12

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

मेरे पास दोनों रूपरेखाओं के साथ लगभग कोई संपर्क नहीं है, लेकिन मैं सी # विंडोज फॉर्म में जो कुछ भी याद करता हूं, वह आमतौर पर नियंत्रण को बढ़ाता है, बस स्विंग के साथ।

होने के नाते आम तौर पर लोगों को विरासत पर रचना पसंद करते हैं, क्यों नहीं स्विंग / विंडोज फॉर्म लोगों ने विरासत के बजाय रचना का पक्ष लिया?


2
15-20 वर्षों में बहुत कुछ बदल गया है जो उन एपीआई के आसपास रहे हैं! ); प्रतिपादन इंजन के लिए बाँध स्क्रीन किसी भी मनमाने ढंग से ठोस वर्ग के उदाहरण के खिलाफ "दिन में वापस" वस्तुओं जादू एक्सएमएल गोंद नहीं था

1
अधिकांश स्विंग कोड जो मैं देखता हूं वह रचना द्वारा विस्तार का उपयोग करता है। मुझे यकीन नहीं है कि आपके प्रोफेसर को उसका डेटा कहां मिल रहा है।

मैंने खुद रचना के बजाय नेट पर बहुत सारे स्विंग देखे हैं - हालांकि ज्यादातर ट्यूटोरियल। लेकिन विंडोज़ के रूपों को वास्तव में विरासत द्वारा लगभग पूरी तरह से आधारित किया जाता है!
इलिसियम को निगल लिया

जवाबों:


7

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

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

रचना पर वंशानुक्रम पसंद करने का एक दक्षता कारण भी है - ओवरराइडिंग की लागत कुछ भी नहीं (कोई superकॉल नहीं मानती ), जबकि रचना में एक अतिरिक्त खर्च होता है INVOKEVIRTUAL। मैं नहीं जानता कि क्या यह स्विंग के डिजाइन को प्रभावित करता है, लेकिन यह संग्रह कक्षाओं के लिए एक बड़ी चिंता है।


2

स्विंग फ्रेमवर्क वास्तव में समग्र डिजाइन पैटर्न के अनुसार बनाया गया है। दी कि वहाँ बहुत विरासत है, लेकिन आप आमतौर पर रचना का उपयोग करके अपने स्वयं के रूपों की रचना करेंगे। यही है, एक रूप मध्यवर्ती स्तर के कंटेनरों और नियंत्रणों की एक रचना है।


"यही है, एक रूप मध्यवर्ती स्तर के कंटेनरों और नियंत्रणों की एक रचना है।" ज़रूर। लेकिन जो मैं आमतौर पर देखता हूं वह यह है कि जब लोग अपनी खिड़की बनाना चाहते हैं (या जो भी स्विंग में कहा जाता है), वे रचना का उपयोग करने के बजाय एक खिड़की वर्ग से विरासत में लेंगे।
25:11

@ देवदारित यक्षिण यह सच है। लेकिन रूप बनाने के लिए वे रचना का उपयोग करेंगे। तो यह थोड़ी सी विरासत और बहुत सारी रचना है।

@ हतोत्साहित, मुझे लगता है कि लोगों को यह एहसास नहीं है कि वे जिस ट्यूटोरियल का उपयोग करते हैं, वह सबसे अच्छा अभ्यास नहीं है क्योंकि यह संक्षिप्तता का पक्षधर है।
पीटर टेलर

1

जावा के साथ, यह सब कुछ आभासी होने के कारण विरासत का उपयोग करने के लिए बहुत आसान है। JTable / JFrame में एक "सुविधा" को ठीक करने की आवश्यकता है? इसे बढ़ाएँ, समस्या के तरीकों को ओवरराइड करें, और फिर इसके बजाय अपनी तालिका / फ़्रेम का उपयोग करें।

मुझे लगता है कि WPF जैसी चीजों के साथ, जहां डेटा बाइंडिंग डिजाइन की एक प्राथमिक विशेषता है, यह वंशानुक्रम के बजाय रचना करना बहुत आसान बनाता है।


"सब कुछ आभासी है " के साथ आपका क्या मतलब है ?
जोनास

जावा में, हर विधि निहित रूप से आभासी है (ओवरराइड की जा सकती है)। C # में, आपको स्पष्ट रूप से एक विधि घोषित करनी होगी virtual, और इसे ओवरराइड करने के लिए, आप स्पष्ट रूप से इसे a घोषित करेंगे override। जावा में, आप जो कुछ भी देख सकते हैं उसे ओवरराइड कर सकते हैं, और आप एक उपवर्ग में इसकी दृश्यता बढ़ा सकते हैं (आप उप-वर्ग में संरक्षित विधियों को सार्वजनिक कर सकते हैं!)
जॉन गार्डनर

ध्यान दें कि आप finalजावा में एक विधि को ओवरराइड नहीं कर सकते हैं , भले ही आधार वर्ग खुद न हो final
पर्पल जूल

यह सच है @perp। लेकिन जावा में आपको वर्चुअल को रोकने के लिए अपने रास्ते से बाहर (अंतिम जोड़कर) जाना होगा । C # विपरीत तरीका है, आपको आभासी होने के लिए अपने रास्ते से बाहर जाना होगा । और मानक जावा रनटाइम का एक बहुत छोटा प्रतिशत अंतिम रूप से चिह्नित है।
जॉन गार्डनर

1

में प्रभावी जावा , मद 17, बलोच कहा गया है कि एक वर्ग तैयार किया गया विरासत के लिए "overridable विधियों में से किसी ने उसकी स्व-उपयोग दस्तावेज़ चाहिए।" इस की एक बानगी यह कार्यान्वयन वाक्यांश है । आप इसे कक्षाओं में देखेंगे जैसे JTableऔर JInternalFrame। यह स्विंग में डिजाइन द्वारा विरासत का एक उपाय है।


-2

सी # 3.5 से, हमारे पास एक अवधारणा है जिसे एक्सटेंशन मेथड्स कहा जाता है जो विरासत की तुलना में रचना की अवधारणा की अनुमति देता है।

इस प्रक्रिया में, हम एक मौजूदा वर्ग में एक विस्तारित वर्ग को जोड़कर एक विस्तारित कार्यक्षमता को लागू करते हैं जो मौजूदा वर्ग के लिए नई सुविधा प्रदान करता है।

आप अधिक जानकारी के लिए यहां देख सकते हैं


मैं नए WinForms नियंत्रण वर्ग बनाने की प्रासंगिकता नहीं देखता। क्या आप विस्तृत कर सकते हैं?
पीटर टेलर

@ पेटर: यह केवल विंडोज़ फॉर्म कक्षाओं से संबंधित नहीं है। यह हमारे कोड से भी लागू हो सकता है। आप किसी भी मौजूदा वर्ग को केवल एक स्थिर वर्ग जोड़कर और फिर 1 तर्क के साथ नई विधि जोड़ सकते हैं ताकि आधार वस्तु को जोड़ा जा सके। कोड संकलित करने के बाद, आपको नए जोड़े गए तरीके को आधार वर्ग की एक विधि के रूप में प्राप्त होता है। यही रचना बताती है। आशा है कि मैं सही हूँ ..
सरवनन

1
मुझे पता है कि विस्तार के तरीके क्या हैं, और वे कई बार बहुत काम आते हैं, लेकिन यह सवाल नई कक्षाओं को बनाने के विभिन्न तरीकों के बारे में है।
पीटर टेलर

@Peter: तब मैं केवल आंशिक वर्गों के उपयोग की ओर इशारा कर सकता हूं, इसके अलावा मेरी समझ में C # में कोई अन्य उल्लेखनीय विशेषता नहीं है। यदि आप किसी को जानते हैं, तो कृपया मुझे बताएं।
सर्वण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.