2010-01-20 8 views
7

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

उत्तर

9

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

+2

एक उदाहरण javax.swing.AbstractAction –

5

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

3

यदि आपके पास एक अमूर्त कक्षा में प्रारंभिक अंतिम फ़ील्ड हैं, तो आपको उन्हें एक निर्माता में प्रारंभ करना होगा।

उदा।

abstract class A { 
    final int x; 
} 

एक निर्माता कि x को आवंटित बिना संकलन नहीं होंगे।

3

यदि आपकी कक्षा एक कन्स्ट्रक्टर घोषित नहीं करती है, तो जावैक आपके लिए कोई तर्क नहीं देगा, आपके लिए कुछ भी नहीं करेगा। फिर, जब आपका उप-वर्ग प्रारंभ होता है, तो वह जेनरेट किए गए नो-ऑप कन्स्ट्रक्टर को कॉल करेगा और जीवन अच्छा होगा।

हालांकि, यदि आपकी कक्षा किसी भी निर्माता को घोषित करती है, तो जावा आपके लिए एक नहीं बनायेगा। उस स्थिति में, उप-वर्ग निर्माता को स्पष्ट रूप से मूल वर्ग के निर्माता को कॉल करने की आवश्यकता होती है। अन्यथा, उपर्युक्त उत्तर का उल्लेख करते हुए, आप अभिभावक वर्ग के सदस्यों को प्रारंभ करने में असफल हो जाएंगे।

2

सार वर्गों के लिए रचनाकारों का उपयोग उप-वर्गों द्वारा किया जाता है (super(params) का उपयोग करके उपclass रचनाकारों से आमंत्रित)।

आपको यह स्पष्ट करने के लिए इन रचनाकारों को protected बनाना चाहिए।

2

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

उपयोग सामान्य विशेषताओं यानी प्रारंभ करने के लिए किया जा सकता है।

import java.util.List; 
import java.util.ArrayList; 
abstract class BaseClass { 
    protected List list; // visible from subclasses 

    public BaseClass() { 
     System.out.println("to abstract..."); 
     // common initialization to all subclasses 
     list = new ArrayList(); 
     list.add("a"); 
     list.add("a"); 
     list.add("a"); 
    } 
} 

class ConcreteClass extends BaseClass { 
    public ConcreteClass(){ 
     // The list is initialized already 
     System.out.println("now it is concrete and the list is: = "+ this.list); 


    } 
} 

class TestAbstractClass { 
    public static void main(String [] args) { 
     BaseClass instance = new ConcreteClass(); 
    } 

} 

आउटपुट

$ java TestAbstractClass 
to abstract... 
now it is concrete and the list is: = [a, a, a] 
1

को डुप्लिकेट सामान्य ज्ञान/व्यवहार।

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

-1

मैं मानता हूं, रचनाकारों को यह माना जाता है कि उदाहरण होंगे। यदि आपके पास बहुत सामान्य कोड है तो आप एक निर्माता बनाने के बारे में सोच सकते हैं लेकिन इसे init() विधि में रखना बेहतर है।

+1

यह बुरी सलाह है, तो प्रत्येक इनहेरेटिंग क्लास को सुपर कॉल करने की याद रखने की आवश्यकता होती है।init() और यह गन्दा तेजी से हो जाता है, यह गैर मानक और वास्तव में बुरी सलाह है। –

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