2010-01-31 14 views
6

मुझे HttpServlet क्लास के बारे में कोई संदेह है कि कक्षा में कोई सार विधि नहीं है, फिर भी सभी विधियां ठोस हैं। क्या कक्षाएं अमूर्त हो सकती हैं भले ही कोई सार तत्व न हो? यदि हाँ क्या उपयोग है?क्या कक्षाएं अमूर्त हो सकती हैं भले ही कोई सार तत्व न हो? यदि हाँ क्या उपयोग है?

धन्यवाद

+0

यह भी देखें http://stackoverflow.com/questions/362446/abstract-class-with-all-concrete-methods –

उत्तर

18

HttpServlet के मामले में, बिंदु यह है कि सर्वलेट प्रोग्रामर आमतौर पर नहीं चाहते हैं कि उनके सर्वलेट मुख्य HTTP विधियों (पोस्ट, प्राप्त करें, पुट, डिलीट) के सभी 4 का समर्थन करें, इसलिए यह परेशान करना होगा doGet(), doPost(), आदि विधियों सार, क्योंकि प्रोग्रामर को उन तरीकों को लागू करने के लिए मजबूर किया जाएगा जिनकी उन्हें आवश्यकता नहीं है। इसलिए, HttpServlet उन सभी विधियों के लिए एक डिफ़ॉल्ट कार्यान्वयन प्रदान करता है जो क्लाइंट को त्रुटि स्थिति कोड को छोड़कर कुछ भी नहीं करता है। प्रोग्रामर उन तरीकों को ओवरराइड कर सकते हैं जिन्हें वे चाहते हैं और बाकी के बारे में चिंता न करें। लेकिन वास्तव में HttpServlet वर्ग का उपयोग करने से कोई समझ नहीं आती है (क्योंकि यह कुछ भी उपयोगी नहीं है), इसलिए यह abstract है।

और वहां आपके पास एक महान उदाहरण है जब किसी भी अमूर्त विधि के बिना एक अमूर्त वर्ग रखने का अर्थ हो सकता है।

+0

यह वास्तव में एक महान उदाहरण है। यह टेम्पलेट विधि पैटर्न भी कहा जाता है। – BalusC

6

एक सार वर्गों का दृष्टांत नहीं कर सकते हैं ताकि आप उन्हें आदेश इसका इस्तेमाल करने में उपवर्ग किया है।
उप-वर्ग में आप अभी भी अपनी विधियों को लागू कर सकते हैं या पैरेंट विधियों को ओवरराइड कर सकते हैं।

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

HttpServlet का एक उप-वर्ग अपनी कार्यक्षमता कार्य करने के लिए विधियों को लागू करने की आवश्यकता नहीं है।

3

यह इरादा का विषय है। यदि कक्षा सार है, तो आप उस वर्ग का उदाहरण नहीं बना सकते - केवल उप-वर्ग के।

मैं जावा पर मजबूत नहीं हूं, लेकिन मेरा अनुमान है कि HttpServlet इसके तरीकों के डिफ़ॉल्ट कार्यान्वयन प्रदान करता है, लेकिन आप उनमें से कुछ को ओवरराइड करने की उम्मीद कर रहे हैं। यह अभी भी उस वर्ग के एक अनिवार्य उदाहरण के लिए बहुत कम समझ में आता है, इसलिए यह सार है इसलिए संकलक किसी भी व्यक्ति को संकेत देता है जो कोशिश करता है।

+0

+1, 'HttpServlet' के तरीकों का डिफ़ॉल्ट व्यवहार * बहुत * उबाऊ वेब पेज ... –

+0

निश्चित रूप से http://www.cavaliers.org/john/boring.html के रूप में उबाऊ नहीं है? – Steve314

2

सभी विधियों के लिए एक ठोस कार्यान्वयन होने पर भी एक वर्ग को एक सार के रूप में चिह्नित करना उन मामलों में सहायक होगा जहां आप सुनिश्चित नहीं हैं कि कक्षा डिज़ाइन पूरा हो गया है या संभावना है कि आप बाद में कुछ तरीकों को जोड़ने की योजना बना रहे हैं। एक वर्ग को बदलना जिसे अमूर्त घोषित किया गया है, बाद में अमूर्त नहीं बनाया गया है, पूर्व-मौजूदा बाइनरी के साथ संगतता को तोड़ता नहीं है, जहां दूसरे तरीके से गोल टूटने की संगतता होती है।

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