2013-10-28 5 views
7

ध्यान दें कि आप एक अमूर्त वर्ग का ऑब्जेक्ट नहीं बना सकते हैं, लेकिन आपके पास अभी भी एक ऑब्जेक्ट संदर्भ हो सकता है जिसका प्रकार एक सार वर्ग है। बेशक, वास्तविक वस्तु जो करने के लिए यह दर्शाता है एक ठोस उपवर्ग का एक उदाहरण होना चाहिए:अमूर्त वर्गों के संदर्भ कैसे हो सकते हैं लेकिन वस्तुओं नहीं?

Account anAccount; // OK 
anAccount = new Account(); // Error—Account is abstract 
anAccount = new SavingsAccount(); // OK 
anAccount = null; // OK 
समझने नहीं तुम क्यों एक अमूर्त वर्ग के लिए एक वस्तु संदर्भ हो सकता है

...

उत्तर

10

जब आपके पास एक ऑब्जेक्ट संदर्भ जिसका प्रकार एक सार वर्ग है, इसका संदर्भ यह नहीं है कि "मैं एक अमूर्त वर्ग का संदर्भ दे रहा हूं।" इसके बजाए, इसका मतलब है "मैं कुछ वास्तविक वस्तु का संदर्भ दे रहा हूं जो उस सार वर्ग का उप-वर्ग है।" यही कारण है कि आप संदर्भ SavingsAccount का संदर्भ ले सकते हैं, जो एक गैर-सारणी वर्ग है जो Account से उप-वर्ग है, लेकिन आप इसे new Account() पर इंगित नहीं कर सकते हैं, क्योंकि आप वास्तव में Account को तुरंत चालू नहीं कर सकते हैं।

ध्यान दें कि संदर्भ स्वयं सार वर्ग का वास्तविक उदाहरण नहीं है।

आशा है कि इससे मदद मिलती है!

+0

ठीक है तो जब आप खाता anAccount जैसी चीजें करते हैं; वह क्या कह रहा है? यह वास्तव में कुछ भी इंगित नहीं कर रहा है? भले ही यह एक अमूर्त वर्ग नहीं था, स्ट्रिंग टीएमपी कहें; आपने अभी तक यह पता नहीं दिया है? – user2809437

+0

@ user2809437- यह सही है। जब आप 'खाता खाता' कहते हैं, तो आपको 'anAccount' नामक एक संदर्भ मिलता है जिसमें प्रारंभ में' शून्य 'होता है, जिसका अर्थ है कि यह किसी भी चीज़ पर इंगित नहीं कर रहा है। यह 'स्ट्रिंग टीएमपी' के साथ समान है; आपको 'स्ट्रिंग' का संदर्भ मिलता है, लेकिन यह' शून्य 'को इंगित करता है क्योंकि आपने इसे अभी तक' स्ट्रिंग 'पर इंगित करने के लिए असाइन नहीं किया है। – templatetypedef

+0

एक और सवाल ... यह करने का क्या मतलब है? यदि आप वर्ग का उदाहरण नहीं बना सकते हैं, तो दोनों संदर्भ के साथ क्यों? – user2809437

1

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

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

यह निश्चित रूप से polymorphism का हिस्सा है।
अमूर्त वर्गों और इंटरफेस के बीच अंतर उल्लेखनीय रूप से छोटे हैं, देखें: Interface vs Abstract Class (general OO)

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