2011-10-09 8 views
18

एक पाठक फ़ील्ड का उपयोग तब किया जाना चाहिए जब आपके पास एक वेरिएबल होता है जिसे ऑब्जेक्ट-इंस्टीटेशन पर जाना जाता है जिसे बाद में बदला नहीं जाना चाहिए।सबक्लस कन्स्ट्रक्टर से लक्ष्य के रूप में रीडोनली-फ़ील्ड

हालांकि किसी को उप-वर्गों के रचनाकारों से केवल पढ़ने वाले फ़ील्ड असाइन करने की अनुमति नहीं है। यह सुपरकैस अमूर्त होने पर भी काम नहीं करता है।

क्या किसी के पास कोई अच्छा स्पष्टीकरण है कि यह या तो अच्छा विचार नहीं है, या सी # languange में कमी क्यों है?

abstract class Super 
{ 
    protected readonly int Field; 
} 

class Sub : Super 
{ 
    public Sub() 
    { 
     this.Field = 5; //Not compileable 
    } 
} 

पुनश्च: आप निश्चित रूप से सुपर क्लास में एक संरक्षित निर्माता में केवल पढ़ने के लिए खेतों का काम होने से एक ही परिणाम तक पहुँच सकते हैं।

+1

इसके अलावा कंपाइलर त्रुटि सटीक नहीं है: 'त्रुटि 68 एक पाठक फ़ील्ड को असाइन नहीं किया जा सकता है (एक कन्स्ट्रक्टर या एक चर प्रारंभकर्ता के अलावा) ' – nicodemus13

उत्तर

12

एकमात्र कारण मैं इस के लिए देख सकते हैं क्योंकि spec के अनुसार, "यह सिर्फ उस तरह से डिजाइन किया गया था":

प्रत्यक्ष कार्य केवल पढ़ने के लिए फ़ील्ड केवल कि घोषणा की या में भाग के रूप में हो सकता है समान कक्षा में एक इंस्टेंस कन्स्ट्रक्टर या स्थिर कन्स्ट्रक्टर।

केवल पढ़ा जा रहा की बात यह नहीं बदला जा सकता है कि जा व्युत्पन्न वर्ग तो संशोधित कर सके कि यह अब सच हो सकता है और कैप्सूलीकरण का उल्लंघन होगा (किसी अन्य वर्ग के आंतरिक भागों को संशोधित करके) है।

+1

यह सच है। लेकिन क्या यह अभी भी सार वर्गों के लिए अनुचित है? शायद कई उप-वर्गों की संभावना के कारण। – philipshield

+2

यह संभवतः अनुचित है, और शायद हम उस डिजाइन निर्णय के सटीक कारण को कभी नहीं जानते। –

+0

मुझे नहीं पता कि यह सार वर्गों के लिए अनुचित क्यों है, क्योंकि उनके पास रचनाकार हो सकते हैं, इसलिए केवल पढ़ने वाले क्षेत्र काम करेंगे। – pauloya

10
public class Father 
{ 
    protected readonly Int32 field; 

    protected Father (Int32 field) 
    { 
     this.field = field; 
    } 
} 

public class Son : Father 
{ 
    public Son() : base(5) 
    { 

    } 
} 

आप इसके बजाय कुछ ऐसा करने की कोशिश कर सकते हैं!

abstract class Super 
{ 
    protected readonly int Field; 

    protected Super(int field) 
    { 
      this.Field = field; 
    } 
} 


class Sub : Super { 
    public Sub():base(5) 
    { 
    } 

}

+0

ओह, मैंने नहीं देखा! क्या यह एक संपादन था? – renatoargh

+0

हां मैंने उल्लेख किया कि मेरे प्रश्न में :) इसके अलावा, एलेक्स ने 10 मिनट पहले सटीक उसी उत्तर को पोस्ट किया था। – philipshield

+2

यह एक संपादन नहीं था, लेकिन उसमें कभी नहीं! यह एक साफ कामकाज – philipshield

0

मुझे लगता है मुख्य कारण सभी .NET भाषा कार्यान्वयन

भी के लिए एक अतिरिक्त जटिलता है, वहाँ हमेशा एक सरल समाधान नहीं है सी # में सार/आभासी संपत्ति।

abstract class Super { 
    protected abstract int Field { get; } 
} 

class Sub : Super { 
    protected override int Field { get { return 5; } } 
} 

मेरी राय में यह एक रचनात्मक होने के बजाय एक बेहतर समाधान है जिसमें प्रत्येक पाठक क्षेत्र को पैरामीटर के रूप में शामिल किया गया है। एक के लिए, क्योंकि संकलक इस इनलाइन करने के साथ ही और इसलिए भी क्योंकि निर्माता समाधान व्युत्पन्न वर्ग में इस तरह दिखेगा में सक्षम है:

class Sub : Super { 
    public Sub() : base(5) { } // 5 what ?? -> need to check definition of super class constructor 
} 

भी वह काम नहीं हो सकता है यदि आप पहले से ही एक निर्माता है कि एक एकल पूर्णांक लेता है मूल्य।

0

मैं एक करके इस मॉडल होगा:

0

मैं सुपरक्लास (जैसा कि एलेक्स द्वारा उल्लिखित) में संरक्षित कन्स्ट्रक्टर का उपयोग करना पसंद करेंगे, एक्सएमएल टिप्पणियों के साथ। यह समस्या को खत्म करना चाहिए जो डॉन एंड्रे ने अपनी कोड टिप्पणी में बताया था।

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

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