2010-03-10 10 views
18

संपादित करें:यह पता चला कि मुझे कुछ स्पष्ट याद आया, लेकिन अगर कोई और एक ही स्पष्ट गलती करता है तो मैं प्रश्न खोलने जा रहा हूं। उन लोगों के लिए धन्यवाद जिन्होंने इसेस्पष्टीकरण के लिए नीचे देखें।किसी इंटरफ़ेस में गुण जोड़ने से व्युत्पन्न प्रकारों में निजी/संरक्षित "सेट" बनाने से रोकें?

क्या एक ऐसी संपत्ति पर गैर-सार्वजनिक सेट होना संभव है जो एक इंटरफ़ेस संपत्ति को ओवरराइड कर रहा हो?

शायद मुझे एक बेवकूफ पल हो रहा है, लेकिन ऐसा लगता है कि एक इंटरफ़ेस में परिभाषित संपत्ति होने के कारण यह आवश्यक है कि कोई व्युत्पन्न वर्ग उस संपत्ति के लिए कोई गैर-सार्वजनिक सेट प्रदान न कर सके।

उदाहरण:

interface IField 
{ 
    bool IsValid { get; } 
} 

... और जब से इंटरफ़ेस गुण पहुँच संशोधक नहीं हो सकता है इसका मतलब है कि:

class Field : IField 
{ 
    public override bool IsValid { get; protected set; } 
} 

... तथ्य यह है कि यह इंटरफ़ेस को पूरा करती है के बावजूद संभव नहीं होगा आवश्यकताओं अवधारणात्मक

आईएमओ के पास गैर-सार्वजनिक गुणों के माध्यम से किए जा सकने वाले encapsulation के लिए बड़े नकारात्मक प्रभाव पड़ते हैं, और संपत्तियों के लिए कई सामान्य उपयोग पैटर को रोकता है।

मुझे पता है कि आप एक गैर-सार्वजनिक SetIsValid सदस्य बना सकते हैं जो एक सामान्य बैकिंग स्टोर को संशोधित करता है, लेकिन इससे एक असंगत पैटर्न बन जाएगा और अन्यथा कोड शोर क्या होगा, यह आवश्यक नहीं है।

क्या मुझे कुछ याद आया है?


संपादित करें: हाँ, मैं कुछ

याद किया मैं इस समय किसी और के कोड को संशोधित कर रहा हूँ और सिर्फ एहसास है कि वर्ग मैं इंटरफ़ेस कार्यान्वित किया है और एक से प्राप्त के साथ कुश्ती गया था आधार वर्ग और मैं C# के लिए नया हूं, यही वजह है कि ओवरराइड भ्रम पैदा हुआ।

वास्तविक वर्ग की तरह देखा:

class Field : IField, BaseField 
{ 
    public override bool IsValid { get; protected set; } 
} 

... जहां BaseField रूप में अच्छी तरह इंटरफ़ेस कार्यान्वित, लेकिन सेट को लागू नहीं किया।

+1

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

+0

इंटरफ़ेस में सार्वजनिक एक टाइपो था। – Catskul

+1

हां, आप उन क्षणों में से एक हैं। –

उत्तर

32

यह पूरी तरह से कानूनी है। आप ओवरराइड कीवर्ड की जरूरत नहीं है (वास्तव में यह संकलन नहीं होगा), लेकिन वहाँ कुछ भी नहीं ऐसा करने से आप को रोकने है:

interface IField 
{ 
    bool IsValid { get; } 
} 

class Field : IField 
{ 
    public bool IsValid { get; protected set; } 
} 
+0

तो अगर मैं एक आईफिल्ड पास करता हूं जो फ़ील्ड ऑब्जेक्ट को संदर्भित करता है, और इसालिद को कॉल करता है, फ़ील्ड। इसावालिद को "ओवरराइड" की कमी के बावजूद बुलाया जाएगा? – Catskul

+0

'ओवरराइड' आपके द्वारा लागू इंटरफेस के आधारभूत आधार वर्गों पर लागू होता है, जिन्हें आप प्राप्त करते हैं। – Gabe

+0

आह। मैं फिलहाल किसी और के कोड को संशोधित कर रहा हूं और केवल यह महसूस कर रहा हूं कि जिस श्रेणी में मैं कुश्ती कर रहा था, वह इंटरफ़ेस * और * बेस क्लास से व्युत्पन्न हुआ। यही वजह है कि ओवरराइड भ्रम पैदा हुआ। – Catskul

6

यह इंटरफेस पर संभव है, लेकिन नहीं सार/आभासी गुणों पर - आप इन दो मिश्रित हो सकता है।

+0

परिभाषा वर्चुअल द्वारा इंटरफ़ेस के सभी तत्व नहीं हैं? (मैं कुछ हद तक नया हूं #) – Catskul

+0

मुझे असली समस्या याद आई। संशोधित पोस्ट देखें। उत्तर के लिए धन्यवाद, इससे मुझे यह देखने में मदद मिली कि मुझे क्या याद आया था। – Catskul

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