जवाबों:
बेशक।
केवल एक वर्ग को घोषित करने का मतलब है कि आप इसे अपने दम पर तत्काल करने की अनुमति नहीं देते हैं।
एक विधि सार घोषित करने का मतलब है कि उपवर्गों को उस पद्धति के लिए एक कार्यान्वयन प्रदान करना होगा।
दो अलग-अलग अवधारणाएं हैं, हालांकि स्पष्ट रूप से आपके पास गैर-सार वर्ग में एक सार पद्धति नहीं हो सकती है। तुम भी final
तरीकों के साथ सार कक्षाएं हो सकता है, लेकिन कभी नहीं अन्य तरीके के आसपास।
हां तुम यह कर सकते हो। आप ऐसा करने की कोशिश क्यों नहीं करते?
हाँ तुम कर सकते हो। जावा में प्रयुक्त अमूर्त वर्ग यह दर्शाता है कि आप कक्षा की एक वस्तु नहीं बना सकते। और एक अमूर्त विधि उपवर्गों को उस पद्धति के लिए एक कार्यान्वयन प्रदान करना होगा।
तो आप किसी अमूर्त विधि के बिना एक अमूर्त वर्ग को आसानी से परिभाषित कर सकते हैं।
उदाहरण के लिए :
public abstract class AbstractClass{
public String nonAbstractMethodOne(String param1,String param2){
String param = param1 + param2;
return param;
}
public static void nonAbstractMethodTwo(String param){
System.out.println("Value of param is "+param);
}
}
यह ठीक है।
हाँ, आप किसी भी सार विधि के साथ सार वर्ग बना सकते हैं। सार पद्धति के बिना सार वर्ग का सबसे अच्छा उदाहरण है HttpServlet
सार विधि एक ऐसी विधि है जिसका कोई शरीर नहीं है, यदि आपने कक्षा में कम से कम एक विधि घोषित की है, तो कक्षा को एक घोषित किया जाना चाहिए। अमूर्त इसके अनिवार्य BUT अगर आपने अमूर्त वर्ग को घोषित किया है तो यह अनिवार्य नहीं है कि कक्षा के अंदर अमूर्त विधि घोषित की जाए।
आप अमूर्त वर्ग की वस्तुएँ नहीं बना सकते हैं, जिसका अर्थ है कि यह तात्कालिक नहीं हो सकता है।
हां, आप एक ऐसे वर्ग की घोषणा कर सकते हैं जिसे आप केवल उन्हीं तरीकों से नहीं रोक सकते हैं जिनमें पहले से ही कार्यान्वयन है। यह तब उपयोगी होगा जब आप भविष्य में अमूर्त विधियों को जोड़ना चाहते थे, या यदि आप नहीं चाहते थे कि वर्ग को सीधे तात्कालिक रूप दिया जाए, भले ही इसमें कोई सार गुण न हों।
हाँ, हम किसी अमूर्त पद्धति के बिना एक अमूर्त वर्ग की घोषणा कर सकते हैं। वर्ग को सार घोषित करने का उद्देश्य वर्ग को तात्कालिक बनाना नहीं है।
इसलिए दो मामले
1) सार विधियों के साथ सार वर्ग।
इस प्रकार की कक्षाएं, हमें इस सार वर्ग से एक श्रेणी प्राप्त करनी चाहिए और हमारी कक्षा में सार विधियों को ओवरराइड करना चाहिए, पूर्व: GenricServlet वर्ग
2) सार विधियों के बिना सार वर्ग।
इस प्रकार की कक्षाएं, हमें इस अमूर्त वर्ग से एक वर्ग विरासत में मिलनी चाहिए, पूर्व: HttpServlet वर्ग करने का उद्देश्य हालांकि आप बच्चे वर्ग में अपने तर्क को लागू नहीं करते हैं, तो आप माता-पिता का तर्क प्राप्त कर सकते हैं
हां, हम एब्सट्रैक्ट मेथड के बिना एब्सट्रैक्ट क्लास रख सकते हैं क्योंकि दोनों स्वतंत्र अवधारणाएं हैं। एक वर्ग के सार को घोषित करने का अर्थ है कि यह अपने आप पर त्वरित नहीं हो सकता है और केवल उप-वर्गीकृत किया जा सकता है। एक विधि सार की घोषणा करने का मतलब है कि विधि को उपवर्ग में परिभाषित किया जाएगा।
हां, आप एक सार पद्धति के बिना एक सार वर्ग को परिभाषित कर सकते हैं। हालांकि, अगर आपके अंदर कोई तरीका नहीं है, तो आप बेहतर तरीके से इंटरफ़ेस के साथ जा सकते हैं
हां, आप यह कर सकते हैं।
कक्षा के सार को घोषित करने का अर्थ है कि कक्षा को किसी अन्य वर्ग द्वारा त्वरित नहीं किया जाएगा।
और उसके अंदर कम से कम एक अमूर्त विधि होनी चाहिए और इसका अर्थ है कि आप उस कक्षा में अमूर्त विधि की घोषणा कर सकते हैं यदि आप इसके ठीक से अधिक विधि की घोषणा नहीं कर रहे हैं।
उदाहरण:
public abstract class abs {
protected int cx = 0, cy = 0;
public void p() {
System.out.print("hello");
}
}
यह सुनिश्चित करने के लिए काम करेगा।
हाँ तुम कर सकते हो। कभी-कभी आपसे यह प्रश्न किया जा सकता है कि यह करने का उद्देश्य क्या है? इसका उत्तर है: कभी-कभी हमें अपने स्वयं के द्वारा कक्षा को तत्काल करने से रोकना पड़ता है। उस स्थिति में, हम चाहते हैं कि उपयोगकर्ता हमारे एब्सट्रैक्ट क्लास और इंस्टेंट चाइल्ड क्लास का विस्तार करें
आप कर सकते हैं, मेरे मन में सवाल आपको अधिक होना चाहिए। मैं शुरू से ही कहूंगा कि इसका कोई कठिन और तेज़ जवाब नहीं है। अपनी मौजूदा स्थिति के लिए सही काम करें।
मेरे लिए विरासत एक 'एक-एक' संबंध है। एक कुत्ते वर्ग की कल्पना करें, जिसे अधिक विशिष्ट उप प्रकारों (अलसैटियन, पूडल, आदि) द्वारा बढ़ाया जा सकता है। इस मामले में कुत्ते के वर्ग को अमूर्त बनाना सही काम हो सकता है क्योंकि उप-प्रकार कुत्ते हैं। अब आइए कल्पना करें कि कुत्तों को एक कॉलर की आवश्यकता होती है। इस मामले में वंशानुक्रम का कोई मतलब नहीं है: कुत्तों और कॉलर के बीच 'एक-एक' संबंध होना बकवास है। यह निश्चित रूप से एक 'है-एक' संबंध है, कॉलर एक सहयोगी वस्तु है। कॉलर एब्सट्रेक्ट बनाना ताकि कुत्तों के पास कोई मतलब न हो।
मुझे अक्सर लगता है कि अमूर्त तरीकों के साथ अमूर्त वर्ग वास्तव में एक 'है-ए' संबंध व्यक्त कर रहे हैं। इन मामलों में मुझे आमतौर पर लगता है कि विरासत का उपयोग किए बिना कोड को बेहतर ढंग से फैक्टर किया जा सकता है। मुझे यह भी लगता है कि बिना किसी अमूर्त विधि वाले अमूर्त वर्ग अक्सर एक कोड गंध होते हैं और बहुत कम से कम एक कोड समीक्षा में उठाए जाने वाले प्रश्नों का नेतृत्व करना चाहिए।
फिर, यह पूरी तरह से व्यक्तिपरक है। अच्छी तरह से ऐसी स्थितियां हो सकती हैं जब कोई सार विधियों के साथ एक सार वर्ग समझ में आता है, यह पूरी तरह से व्याख्या और औचित्य तक है। आप जो भी काम कर रहे हैं उसके लिए सबसे अच्छा निर्णय लें।
वास्तव में इसका कोई मतलब नहीं है अगर एक अमूर्त वर्ग के पास कोई सार विधि नहीं है। एक सार वर्ग एक पिता की तरह है। इस पिता के पास कुछ गुण और व्यवहार हैं, जब आप एक बच्चे के रूप में पिता का बच्चा बनना चाहते हैं, तो पिता कहते हैं कि बच्चा (आप) इस तरह से होना चाहिए, इसका हमारा MOTO, और यदि आप ऐसा नहीं करना चाहते हैं, तो आप मेरा बच्चा नहीं है
WindowDecorator
औरCoffeeDecorator
कर रहे हैंabstract
कक्षाएं, लेकिन न तो एक भी शामिल हैabstract
विधि।