2010-04-30 13 views
14

में 'सार्वजनिक' कन्स्ट्रक्टर की प्रासंगिकता क्या एक अमूर्त वर्ग में 'सार्वजनिक' कन्स्ट्रक्टर की कोई प्रासंगिकता है? मैं इसका उपयोग करने के किसी भी संभावित तरीके से नहीं सोच सकता, उस मामले में इसे संकलक द्वारा त्रुटि के रूप में नहीं माना जाना चाहिए (सी #, सुनिश्चित नहीं है कि अन्य भाषाएं इसे अनुमति दें)।अमूर्त वर्ग

नमूना कोड: जबकि वहाँ कोई रास्ता नहीं मैं बाहर की दुनिया से इस contructor कॉल कर सकते हैं है

internal abstract class Vehicle 
{ 
    public Vehicle() 
    {    
    } 
} 

सी # संकलक, इस कोड को संकलित करने के लिए अनुमति देता है। इसे केवल व्युत्पन्न कक्षाओं से ही बुलाया जा सकता है। तो इसे केवल 'संरक्षित' और 'निजी' संशोधक को अनुमति नहीं देनी चाहिए। कृपया टिप्पणी करें।

+0

http://stackoverflow.com/questions/260744/abstract-class-constructor-access-modifier –

+0

@JohnSaunders हाँ, एक नकली के संभावित डुप्लिकेट है, हालांकि यह सवाल जावा के बारे में है। लेकिन इस संबंध में जावा और सी # के बीच बिल्कुल कोई अंतर नहीं है (मुझे लगता है)। –

उत्तर

5

यहां एक सार वर्ग के लिए सार्वजनिक निर्माता के लिए कोई कारण नहीं है। मुझे लगता है कि संकलक शिकायत नहीं करता है कि यह कारण इतना आसान है कि उन्होंने समय को कवर करने में समय नहीं लगाया क्योंकि यह वास्तव में कोई फर्क नहीं पड़ता कि यह सार्वजनिक है या संरक्षित है।

1

हां, एक अमूर्त वर्ग पर public सीटीओ अर्थहीन और थोड़ा भ्रामक है क्योंकि यह केवल व्युत्पन्न कक्षाओं में संरक्षित के रूप में व्यवहार करेगा, इसे कॉल कर सकता है।

private सीटीआर दिलचस्प किनारे के मामलों के बाहर थोड़ा अर्थ होगा।

protected सीटीओआर व्युत्पन्न कक्षाओं द्वारा आवश्यक होने पर समझ में आ जाएगा।

+1

एक 'निजी' कन्स्ट्रक्टर एक अमूर्त वर्ग में समझ में आता है। – dan04

+0

@ दान- खुश? ;-) –

+0

@ dan04: क्या किसी अन्य परिस्थिति से बंधे होने के अलावा किसी भी स्थिति में यह समझ में आता है? – supercat

1

शिकार: Abstract class constructor access modifier

उस सवाल पर जवाब अंत में एक ही बात करने के लिए नीचे आ: यह वास्तव में यदि आप इसे protected या public घोषित कोई फर्क नहीं पड़ता वहाँ तो बस इस तरह पर एक और सवाल है।

साहित्य में इसके बारे में कुछ चर्चा भी होती है (उदाहरण के लिए Framework Design Guidelines में)। यह इस ब्लॉग पोस्ट में संदर्भित है: Good design or bad design of abstract class?

+0

यह प्रश्न सी # के बारे में है, और दूसरा जावा के बारे में है। इसलिए यह एक डुप्लिकेट नहीं है। – hypehuman

3
एक अमूर्त वर्ग के अंदर

, एक उदाहरण के निर्माता के लिए, संशोधक public, protected internal, और protected सब बराबर हैं। फिर internal उनके मुकाबले अधिक सख्त है, और private सबसे सख्त पहुंच है।

यदि सभी इंस्टेंस कन्स्ट्रक्टर private हैं, तो केवल कक्षा में निहित कक्षाएं ही इसमें से प्राप्त हो सकती हैं।

नोट: यदि गैर-स्थैतिक वर्ग के लिए कोई इंस्टेंस कन्स्ट्रक्टर नहीं दिया जाता है, तो संकलक स्वयं एक उत्पन्न करेगा। यह एक कन्स्ट्रक्टर शून्य तर्क ले रहा है। यदि कक्षा सार है, तो ऑटो-जेनरेटेड कन्स्ट्रक्टर protected है। अन्यथा यह public है।

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

ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors(); 

एक खाली सरणी दे देंगे अगर एकमात्र निर्माता protected है, और लंबाई -1 सरणी अगर यह public है के रूप में। लेकिन निश्चित रूप से ओवरलोड हैं जो BindingFlags निर्दिष्ट करते हैं, इसलिए यह कोई समस्या नहीं है, अगर कोई प्रतिबिंब का उपयोग करता है तो याद रखने के लिए कुछ।

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