किसी अमूर्त तरीकों के बिना एक अमूर्त वर्ग को परिभाषित करना


114

क्या मैं एक अमूर्त पद्धति को जोड़े बिना एक सार वर्ग को परिभाषित कर सकता हूं?


1
एक अच्छा उदाहरण डेकोरेटर पैटर्न में पाया जा सकता है, यहां देखें । दोनों WindowDecoratorऔर CoffeeDecoratorकर रहे हैं abstractकक्षाएं, लेकिन न तो एक भी शामिल है abstractविधि।
एमएस डौस्टी

जवाबों:


168

बेशक।

केवल एक वर्ग को घोषित करने का मतलब है कि आप इसे अपने दम पर तत्काल करने की अनुमति नहीं देते हैं।

एक विधि सार घोषित करने का मतलब है कि उपवर्गों को उस पद्धति के लिए एक कार्यान्वयन प्रदान करना होगा।

दो अलग-अलग अवधारणाएं हैं, हालांकि स्पष्ट रूप से आपके पास गैर-सार वर्ग में एक सार पद्धति नहीं हो सकती है। तुम भी finalतरीकों के साथ सार कक्षाएं हो सकता है, लेकिन कभी नहीं अन्य तरीके के आसपास।


14

हां तुम यह कर सकते हो। आप ऐसा करने की कोशिश क्यों नहीं करते?


6
और यह सिर्फ ओपी नहीं है। सभी upvotes को देखो सवाल मिल गया है!
मार्क डब्ल्यू

54
@ karim79 उच्च घोड़ों और उस सॉस डालने वाले सामान की कोई आवश्यकता नहीं है। इसे आज़माने से यह पता नहीं चलता कि यह अनुमति क्यों है, जबकि यह पूछ सकता है।
बिजिकलोप

7
@bizclop - खुद के लिए इसे आजमाने से अधिक उत्पादक सवाल पैदा हो सकता है। ऊँचे घोड़े नहीं हैं। यह बहुत सीधा है। उनका सवाल था ... ऐसा क्यों होता है ’… के बजाय ... कैन आई’ हो सकता है।
करीम79

8
यदि प्रश्न का उत्तर एक साधारण हां या नहीं के साथ दिया जा सकता है, तो पूछने वाले को Google का उपयोग करके, या बस इसे आज़माने का विचार करना चाहिए।
टायलर ट्रीट

3
@ karim79 हाँ, इस सवाल को बेहतर ढंग से समझा जा सकता था, लेकिन मुझे लगता है कि यह एक कदम आगे देखने के लिए इतना प्रयास नहीं करता है।
बिजिकलोप

8

हाँ तुम कर सकते हो। जावा में प्रयुक्त अमूर्त वर्ग यह दर्शाता है कि आप कक्षा की एक वस्तु नहीं बना सकते। और एक अमूर्त विधि उपवर्गों को उस पद्धति के लिए एक कार्यान्वयन प्रदान करना होगा।

तो आप किसी अमूर्त विधि के बिना एक अमूर्त वर्ग को आसानी से परिभाषित कर सकते हैं।

उदाहरण के लिए :

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);
    }
}

यह ठीक है।


6

हाँ, आप किसी भी सार विधि के साथ सार वर्ग बना सकते हैं। सार पद्धति के बिना सार वर्ग का सबसे अच्छा उदाहरण है HttpServlet
सार विधि एक ऐसी विधि है जिसका कोई शरीर नहीं है, यदि आपने कक्षा में कम से कम एक विधि घोषित की है, तो कक्षा को एक घोषित किया जाना चाहिए। अमूर्त इसके अनिवार्य BUT अगर आपने अमूर्त वर्ग को घोषित किया है तो यह अनिवार्य नहीं है कि कक्षा के अंदर अमूर्त विधि घोषित की जाए।

आप अमूर्त वर्ग की वस्तुएँ नहीं बना सकते हैं, जिसका अर्थ है कि यह तात्कालिक नहीं हो सकता है।


4

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


सवाल खाली अमूर्त वर्गों के बारे में नहीं था, बिना अमूर्त तरीकों के सिर्फ अमूर्त वर्ग। जहां तक ​​मैं पूरी तरह से खाली सार वर्ग का उपयोग करने के लिए देख सकता हूं, उसका कोई वैध कारण नहीं है।
बिजिकलोप

1
जवाब तय है। खाली सार वर्ग का उपयोग करना उपयोगी हो सकता है यदि आपके पास बाद में सार विधियों को जोड़ने के लिए अच्छा कारण है और किसी भी अन्य मूल वर्गों को फिर से तैयार करने से निपटने के लिए नहीं है।
गॉर्डन गुस्ताफसन

1
एक पदानुक्रम के बीच में, एक पूरी तरह से खाली (विरासत की युक्ति को छोड़कर) अमूर्त वर्ग समझ में आ सकता है यदि उस वर्ग के व्युत्पन्न के पास माता-पिता की अन्य व्युत्पत्तियों के अलग-अलग संविदात्मक दायित्व होंगे।
सुपरकैट

3

हाँ, हम किसी अमूर्त पद्धति के बिना एक अमूर्त वर्ग की घोषणा कर सकते हैं। वर्ग को सार घोषित करने का उद्देश्य वर्ग को तात्कालिक बनाना नहीं है।

इसलिए दो मामले

1) सार विधियों के साथ सार वर्ग।

इस प्रकार की कक्षाएं, हमें इस सार वर्ग से एक श्रेणी प्राप्त करनी चाहिए और हमारी कक्षा में सार विधियों को ओवरराइड करना चाहिए, पूर्व: GenricServlet वर्ग

2) सार विधियों के बिना सार वर्ग।

इस प्रकार की कक्षाएं, हमें इस अमूर्त वर्ग से एक वर्ग विरासत में मिलनी चाहिए, पूर्व: HttpServlet वर्ग करने का उद्देश्य हालांकि आप बच्चे वर्ग में अपने तर्क को लागू नहीं करते हैं, तो आप माता-पिता का तर्क प्राप्त कर सकते हैं

कृपया HttpServlet स्रोत कोड देखें


2

हां, हम एब्सट्रैक्ट मेथड के बिना एब्सट्रैक्ट क्लास रख सकते हैं क्योंकि दोनों स्वतंत्र अवधारणाएं हैं। एक वर्ग के सार को घोषित करने का अर्थ है कि यह अपने आप पर त्वरित नहीं हो सकता है और केवल उप-वर्गीकृत किया जा सकता है। एक विधि सार की घोषणा करने का मतलब है कि विधि को उपवर्ग में परिभाषित किया जाएगा।


मुझे क्यों नहीं चाहिए कि वर्ग को त्वरित नहीं किया जा सकता है? कोई अच्छा कारण, उदाहरण?
करालिहानोस

2

हां, आप एक सार पद्धति के बिना एक सार वर्ग को परिभाषित कर सकते हैं। हालांकि, अगर आपके अंदर कोई तरीका नहीं है, तो आप बेहतर तरीके से इंटरफ़ेस के साथ जा सकते हैं


4
न्यूनतम 30 वर्ण की सीमा लेने के लिए अच्छा विचार है।
मार्क डब्ल्यू

1
यदि कोई अमूर्त विधि नहीं है तो एक इंटरफ़ेस का उपयोग कैसे किया जा सकता है? डिफ़ॉल्ट रूप से इंटरफ़ेस में सभी विधियाँ समरूप हैं।
उस्मान राणा

1

हां, आप यह कर सकते हैं।

कक्षा के सार को घोषित करने का अर्थ है कि कक्षा को किसी अन्य वर्ग द्वारा त्वरित नहीं किया जाएगा।

और उसके अंदर कम से कम एक अमूर्त विधि होनी चाहिए और इसका अर्थ है कि आप उस कक्षा में अमूर्त विधि की घोषणा कर सकते हैं यदि आप इसके ठीक से अधिक विधि की घोषणा नहीं कर रहे हैं।

उदाहरण:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

यह सुनिश्चित करने के लिए काम करेगा।


1

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


1

आप कर सकते हैं, मेरे मन में सवाल आपको अधिक होना चाहिए। मैं शुरू से ही कहूंगा कि इसका कोई कठिन और तेज़ जवाब नहीं है। अपनी मौजूदा स्थिति के लिए सही काम करें।

मेरे लिए विरासत एक 'एक-एक' संबंध है। एक कुत्ते वर्ग की कल्पना करें, जिसे अधिक विशिष्ट उप प्रकारों (अलसैटियन, पूडल, आदि) द्वारा बढ़ाया जा सकता है। इस मामले में कुत्ते के वर्ग को अमूर्त बनाना सही काम हो सकता है क्योंकि उप-प्रकार कुत्ते हैं। अब आइए कल्पना करें कि कुत्तों को एक कॉलर की आवश्यकता होती है। इस मामले में वंशानुक्रम का कोई मतलब नहीं है: कुत्तों और कॉलर के बीच 'एक-एक' संबंध होना बकवास है। यह निश्चित रूप से एक 'है-एक' संबंध है, कॉलर एक सहयोगी वस्तु है। कॉलर एब्सट्रेक्ट बनाना ताकि कुत्तों के पास कोई मतलब न हो।

मुझे अक्सर लगता है कि अमूर्त तरीकों के साथ अमूर्त वर्ग वास्तव में एक 'है-ए' संबंध व्यक्त कर रहे हैं। इन मामलों में मुझे आमतौर पर लगता है कि विरासत का उपयोग किए बिना कोड को बेहतर ढंग से फैक्टर किया जा सकता है। मुझे यह भी लगता है कि बिना किसी अमूर्त विधि वाले अमूर्त वर्ग अक्सर एक कोड गंध होते हैं और बहुत कम से कम एक कोड समीक्षा में उठाए जाने वाले प्रश्नों का नेतृत्व करना चाहिए।

फिर, यह पूरी तरह से व्यक्तिपरक है। अच्छी तरह से ऐसी स्थितियां हो सकती हैं जब कोई सार विधियों के साथ एक सार वर्ग समझ में आता है, यह पूरी तरह से व्याख्या और औचित्य तक है। आप जो भी काम कर रहे हैं उसके लिए सबसे अच्छा निर्णय लें।


1

वास्तव में इसका कोई मतलब नहीं है अगर एक अमूर्त वर्ग के पास कोई सार विधि नहीं है। एक सार वर्ग एक पिता की तरह है। इस पिता के पास कुछ गुण और व्यवहार हैं, जब आप एक बच्चे के रूप में पिता का बच्चा बनना चाहते हैं, तो पिता कहते हैं कि बच्चा (आप) इस तरह से होना चाहिए, इसका हमारा MOTO, और यदि आप ऐसा नहीं करना चाहते हैं, तो आप मेरा बच्चा नहीं है

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