2012-04-18 16 views
20

मैं समझता हूं कि हमें जावा में सार कक्षा की आवश्यकता क्यों है - उप-वर्ग बनाने के लिए। लेकिन यह ठोस वर्ग द्वारा हासिल किया जा सकता है। जैसे कक्षा बाल माता पिता का विस्तार करता है। यहां अभिभावक बहुत अच्छी तरह से & ठोस हो सकता है। तो हमारे पास ABSTRACT क्यों है ??अमूर्त वर्ग कंक्रीट वर्ग से अलग कैसे है?

+8

पशु पशु = नया पशु(); << क्या पशु? कई मामलों में यह समझ में नहीं आता है, इसलिए अमूर्त वर्ग। आप सीधे एक उदाहरण नहीं बना सकते हैं। यह एक बिल्ली या कुत्ते की तरह एक उप प्रकार होना चाहिए या जो भी – Polity

+2

प्रोग्रामेटिक रूप से हासिल किया जा सकता है, अगर हम एक ठोस वर्ग के रूप में पशु होता। मैं जावा रचनाकारों द्वारा ABSTRACT की अवधारणा को पेश करने के पीछे तर्क को समझने की कोशिश कर रहा हूं। –

+0

यह कोड की अनावश्यकता को सीमित करता है और प्रभावशीलता भी बढ़ाता है। इसके अलावा यह लगा सकता है कि अमूर्त वर्ग की कुछ अपूर्ण कार्यक्षमता कंक्रीट कक्षा में उपयोग की जा सकती है। एक इंटरफ़ेस और कक्षा को एक साथ जोड़ना और आपको अपने सभी ठोस वर्गों में इंटरफ़ेस को लागू करने की आवश्यकता नहीं है। –

उत्तर

43

सार कक्षाओं को तुरंत चालू नहीं किया जा सकता है। एक वर्ग को अमूर्त के रूप में घोषित करने का अर्थ है कि आप यह नहीं चाहते हैं कि इसे तुरंत चालू किया जाए और कक्षा को केवल विरासत में ही प्राप्त किया जा सके। आप अपने कोड में एक नियम लगा रहे हैं।

यदि आप एक व्यक्ति वर्ग को शामिल करने के लिए अपने माता-पिता/बाल संबंध उदाहरण को आगे बढ़ाते हैं तो व्यक्ति को अमूर्त होने के लिए यह अच्छी समझ होगी। अभिभावक एक ठोस विचार है और इसलिए बच्चा है। व्यक्ति वास्तविकता के साथ-साथ कोड में एक अमूर्त अवधारणा है।

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

अब, क्या आपको अमूर्त कक्षा का उपयोग करना है और लोगों के बजाय कार्यों और क्षेत्रों को निजी रूप से परिभाषित करना है? नहीं, आप नहीं हैं। लेकिन इन अवधारणाओं को कोड को साफ और सुव्यवस्थित रखने में मदद के लिए प्रदान किया जाता है। अमूर्त वर्ग सभी ऑब्जेक्ट उन्मुख भाषाओं में मेरे ज्ञान के लिए लागू किया गया है। यदि आप चारों ओर देखते हैं तो आप देखेंगे कि सी ++, सी #, वीबी.नेट आदि सभी इस अवधारणा का उपयोग करते हैं।

एक बेहतर, विशिष्ट उदाहरण: क्योंकि यह अपने आप ही उपयोगी नहीं है

Shape hierarchy UML Diagram

आकार वर्ग ऊपर के उदाहरण में सार होना चाहिए।

+2

लेकिन इस नियम को लागू करके हमें क्या लाभ मिलता है? –

+1

कोड पुन: उपयोग। अमूर्त वर्ग में फ़ंक्शन को कार्यान्वित करें और अब सभी उप-वर्गों में यह विधि लागू की गई है। इंटरफेस को लागू करते समय आमतौर पर इसका उपयोग किया जाता है और कई कार्यान्वयन कुछ तरीकों के लिए एक ही कोड साझा करते हैं। –

+1

मुझे लगता है कि अभिभावक/बाल/व्यक्ति अमूर्तता और विरासत को समझाने के लिए एक बुरा सादृश्य है: एक व्यक्ति हमेशा एक बच्चा होता है (दो अन्य व्यक्तियों का) और यह बहुत आम है कि समय के बाद वे एक माता-पिता भी हैं (कुछ अन्य व्यक्ति (यों))। –

6

सार वर्ग का अर्थ है कि यह सार पूर्ण नहीं है। इसे और/या इसकी कार्यक्षमताओं को पूरा करने के लिए इसे किसी अन्य वर्ग की आवश्यकता है। आपको अमूर्त वर्ग का विस्तार करने की आवश्यकता है। यह कुछ वर्ग उदाहरण के साथ उपयोगी होगा। फल सभी फलों में रंग की तरह ही संपत्ति होती है। लेकिन आपके पास अलग-अलग फलों के लिए अलग-अलग गुण हो सकते हैं जैसे कि यह नारंगी या न कि केले आदि जैसे गूदे हैं।

+0

लेकिन बिंदु एक ठोस वर्ग द्वारा हासिल किया जा सकता है। मैं यह समझने की कोशिश कर रहा हूं कि इस तथ्य से परे कुछ भी है कि अमूर्त वर्ग उन वर्गों के लिए है जो वास्तव में ठोस नहीं हैं या क्या कुछ और है? –

+1

उस मामले में उत्तर नहीं है। आप एक कक्षा में अपना पूरा ऐप (यहां तक ​​कि 100KLOC +) भी प्राप्त कर सकते हैं। लेकिन हम नहीं करते हैं, और हम अलग-अलग इकाइयों के लिए अलग-अलग वर्ग बनाते हैं। सार वर्ग कार्यक्रम की संरचना में सुधार करता है –

3

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

4

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

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

public abstract class AbstractCache { 
    public final void open() { 
     ... // Do something here to log your metrics 
     openImpl(); 
    } 

    protected abstract void openImpl() { } 
} 

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

2

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

0

कहा जाता है मेरी समझ

सार कक्षा के अनुसार एक वर्ग जो सिर्फ व्यवहार का वर्णन करता है, लेकिन इसे लागू नहीं करता है। सार कक्षा के लिए इस जावा उदाहरण पर विचार करें:

public interface DoSomething(){ 
public void turnOnTheLight(); 
} 

ठोस वर्ग उन है, जो लागू किया जाना कर रहे हैं। उदाहरण के लिए:

public abstract class A(){ 
     public void doIt(); 
    } 
    public class B extends A(){ 
     public void doIt(){ 
     //concrete method 
     System.out.println(“I am a Concrete Class Test”); 
    } 
} 

दूसरे शब्दों में, जावा में एक ठोस वर्ग किसी भी तरह के वर्ग या तो इंटरफ़ेस या अमूर्त वर्ग से विरासत में मिला के सदस्यों के सभी के कार्यान्वयन है जो है।

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