2010-08-10 11 views
6

मेरा पहला प्रश्न: एक अमूर्त वर्ग में संरक्षित और सार्वजनिक निर्माता के बीच क्या अंतर है?निजी, सार्वजनिक और संरक्षित रचनाकारों के साथ अमूर्त वर्ग के बारे में कुछ प्रश्न

मेरे दूसरे प्रश्न: क्या यह समझ में आता है, अगर अमूर्त वर्ग का निजी कन्स्ट्रक्टर है?

अग्रिम धन्यवाद!

उत्तर

6

एक संभावित डिजाइन कि एक अमूर्त वर्ग पर एक निजी निर्माता का प्रयोग करेंगे:

public abstract class BaseClass 
{ 
    private BaseClass(Object param) 
    { 
     //Do something with parameters 
    } 

    //Provide various methods that descendant classes will know how to perform 

    public static BaseClass FromObject(Object value) 
    { 
     //Based on object, choose which type of derived class to construct... 
    } 

    private class HiddenDerivedA : BaseClass 
    { 
     public HiddenDerivedA(Object value) 
      : base(value) 
     { 
     } 
    } 

    private class HiddenDerivedB : BaseClass 
    { 
     public HiddenDerivedB(Object value) 
      : base(value) 
     { 
     } 
    } 
} 

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

3
  1. बहुत कम। सार्वजनिक कन्स्ट्रक्टर का उपयोग केवल संरक्षित व्यक्ति के रूप में किया जा सकता है।

  2. हां, इसे अन्य (संरक्षित/सार्वजनिक) रचनाकारों के this कीवर्ड के साथ ('किनारे') कहा जा सकता है।

+0

2 में: आपका मतलब "यह" कीवर्ड है। "बेस" व्युत्पन्न कक्षाओं में है और निजी ctors को कॉल नहीं कर सकता है। –

+0

@ जॉन: हाँ, thx। संपादित करेंगे –

+0

@ जॉन, "आधार" निजी रचनाकारों को कॉल कर सकता है यदि व्युत्पन्न प्रकार व्युत्पन्न प्रकार का घोंसला वाला वर्ग है। –

3

प्रश्न # 1: ज्यादा। आप वैसे भी एक अमूर्त वर्ग (तुरंत इसे तुरंत) के निर्माता को कॉल नहीं कर सकते हैं। आप केवल एक उप-वर्ग से कॉल कर सकते हैं, जिसका अर्थ है कि उस समय आपको संरक्षित सदस्यों के साथ-साथ सार्वजनिक सदस्यों तक पहुंच होगी।

प्रश्न # 2: नहीं, ज्यादा समझ में नहीं आता है। एक अमूर्त वर्ग पर एक निजी कन्स्ट्रक्टर को उसी श्रेणी में एक गैर-निजी कन्स्ट्रक्टर से "कन्स्ट्रक्टर चेनिंग" द्वारा ही बुलाया जा सकता है।

+0

# 2 उपयोगी हो सकता है। –

+0

@ हेनक होल्टरमैन - मैं इसे देख सकता था। इसे खत्म नहीं करेंगे! दान के उत्तर के अनुसार, –

+2

# 2 - या नेस्टेड प्रकार से एक कन्स्ट्रक्टर। –

-1

वहाँ मेरे लिए बहुत अंतर है, निम्नलिखित कोड outputs अगर यह संरक्षित है

फू
बार

public abstract class Foo 
{ 
    protected Foo() { 
     Console.WriteLine ("Foo"); 
    } 
} 

public class Bar : Foo 
{ 
    public Bar() { 
     Console.WriteLine ("Bar"); 
    } 
} 

void Main() 
{ 
    new Bar(); 
} 

एक सार निर्माता ओवरराइड नहीं किया जा सकता है नहीं लगता है। यकीन है कि यदि ऐसा नहीं होता मैं अपने प्रश्न का उत्तर :-)

+1

"अमूर्त कन्स्ट्रक्टर" जैसी कोई चीज़ नहीं है और आप कन्स्ट्रक्टर को ओवरराइड नहीं कर सकते हैं। –

+0

ऐसा हो सकता है, लेकिन यदि आप ऊपर दिए गए कोड को आजमाते हैं तो आप देखेंगे कि मेरे पास एक अमूर्त वर्ग में एक कन्स्ट्रक्टर है जो वास्तव में निष्पादित करता है जब उस वर्ग से प्राप्त होने वाली कक्षा बनाई जाती है। –

0

मेरे पहले प्रश्नों को स्पष्ट करने के लिए, मैं फिर से जवाब दूंगा (टिप्पणी के बिना)। इसलिए, मुझे पता है कि अमूर्त वर्ग को सीधे स्थापित करना संभव नहीं है। केवल तभी जब कोई वर्ग एबस्टारक्ट क्लास से निकलता है, तो उसे इंस्टेंसियेट किया जा सकता है। मुझे पता है कि एक वर्ग में निजी, सार्वजनिक, आंतरिक और संरक्षित जैसे निर्माता भी हो सकते हैं। क्या मतलब है, मुझे पता है।

लेकिन जनता के बीच एक अमूर्त वर्ग में संरक्षित कन्स्ट्रक्टर के बीच क्या अंतर है। मैं वहां जुड़वां अंतर नहीं देख सकता।

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