2011-01-31 2 views
6

में यह() और बेस() कन्स्ट्रक्टर इस() और आधार() कन्स्ट्रक्टर दोनों को निर्दिष्ट करने के लिए कोई भाषा वाक्यविन्यास प्रतीत नहीं होता है। इस (0) कॉल:सी (

public class Bar : Foo 
{ 
    public Bar() 
     :base(1) 
     //:this(0) 
    { } 
    public Bar(int schmalue) 
     :Foo(1) 
    { 
     //Gobs of initialization code 
     ... 
     Schmalue = schmalue; 
    } 

    public int Schmalue { get; private set; } 
} 

public class Foo 
{ 
    public Foo() 
    { 
     Value = 0; 
    } 

    public class Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

संकलक मुझे बताते हुए जब uncommenting कि '{' उम्मीद थी एक त्रुटि देता है: निम्नलिखित कोड को देखते हुए। यह परेशान है क्योंकि यह मुझे अपने कोड को एक निजी विधि में कारक बनाने का कारण बनता है, जब इस कार्यक्षमता को ऐसी चीज को रोकने के लिए स्पष्ट रूप से प्रदान किया गया था।

क्या मैं बस यह गलत कर रहा हूं? मैंने कोई विभाजक, अर्ध-कॉलन, कॉमा का प्रयास नहीं किया है ... ऐसा लगता है कि यह देव टीम से सिर्फ एक निरीक्षण था। मुझे दिलचस्पी है कि यह क्यों छोड़ा गया था, अगर मैं इस बारे में गलत तरीके से जा रहा हूं या किसी के पास विकल्पों के लिए अच्छे सुझाव हैं।

+1

संभावित कॉलिंग [कॉलिंग ओवर्रिडेन कन्स्ट्रक्टर और सी # में बेस कन्स्ट्रक्टर] [http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded

+2

सभी के लिए धन्यवाद उत्तर का संक्षेप में, समस्या यह है कि यह() एक और आधार कन्स्ट्रक्टर भी कॉल कर सकता है। – Sprague

उत्तर

8

आप अपने श्रृंखला के अंत में आधार निर्माता लागू ऐसा कर सकते हैं:

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
+0

धन्यवाद, यह जवाब है। कई अन्य लोगों ने आपको समान चीजों के बारे में बताया (कुछ और स्पष्ट रूप से) लेकिन यह निश्चित रूप से यह है। – Sprague

3

नहीं, आप केवल एक ही कन्स्ट्रक्टर को चेन कर सकते हैं - या तो एक ही कक्षा या बेस कन्स्ट्रक्टर में एक और कन्स्ट्रक्टर।

यह वास्तव में स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं। आम तौर पर मुझे लगता है कि व्युत्पन्न वर्ग में एक "प्राथमिक" कन्स्ट्रक्टर बनाने के लायक है: व्युत्पन्न कक्षा के भीतर अन्य सभी रचनाकार प्राथमिक "को कॉल करने के लिए" इस "का उपयोग करते हैं, जो उपयुक्त बेस कन्स्ट्रक्टर को कॉल करने के लिए" आधार "कहलाता है।

कि मॉडल हर परिदृश्य फिट नहीं करता है - विशेष रूप से आप अलग अलग व्युत्पन्न कंस्ट्रक्टर्स से अलग आधार कंस्ट्रक्टर्स कॉल करना चाहते हैं जब - यह आमतौर पर एक अच्छा मॉडल है।

1

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

0

बार में दूसरा ctor बस गलत है। प्रयास करें:

public Bar(int schmalue) 
    :base(1) //would call Foo(1) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 

पहले ctor में टिप्पणी schmalue साथ

  • इनिशियलाइज़ बार मूल्य = 1

साथ = 0

  • कॉल आधार ctor फू की तरह कुछ मतलब रहा है

    सही?

    ऐसा करते हैं, दूसरी ctor की जगह और बस एक (निजी) ctor कि संभाल दोनों को महत्व देता

    public Bar(int schmalue) 
        :this(1, schmalue) //would call Bar(1, schmalue) 
    { 
    } 
    
    private Bar(int value, int schmalue) 
    :base(value) 
    { 
        //Gobs of initialization code 
        ... 
        Schmalue = schmalue; 
    } 
    
  • 3

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

    इस प्रकार, base और this दोनों को कॉल करना प्रतिबंधित है। अपने प्रतिनिधियों को this कन्स्ट्रक्टर को विशिष्ट मानकों के साथ आधार पर कॉल करने दें, यदि इसकी आवश्यकता हो।