2011-04-15 21 views
6
public interface ITest 
{ 
    int ChildCount { get; set; } 
} 

public class Test 
{ 
} 

public class OrderPool : ITest, Test 
{ 
    public int ChildCount 
    { 
     get; 
     set; 
    } 
} 

त्रुटि कहती है कि बेस क्लास 'टेस्ट' किसी भी इंटरफेस से पहले आना चाहिए। कक्षा को पहले विस्तारित करना और फिर पूर्णांक को लागू करना क्यों आवश्यक है?व्युत्पन्न कक्षा घोषित करते समय इंटरफ़ेस से पहले बेस क्लास को निर्दिष्ट क्यों किया जाना चाहिए?

उत्तर

16

क्योंकि specification अनुभाग §17.1.2 में ऐसा कहता है।

+2

+1, यह भी जावा में पता होना चाहिए आपको पहले 'विस्तार' लिखना होगा और फिर 'लागू करना' होगा। यह अधिक तार्किक है और शायद अन्य भाषाओं में (सी # और जावा के अलावा) यह वही है। –

+1

कृपया, अपने उत्तर में विनिर्देश से प्रासंगिक भागों को शामिल करें। दूसरा लिंक मुझे टूटा हुआ दिखता है। – Alexei

3

यह वाक्य रचना कहा जाता है

सम्मेलनों कि आप कोड को संकलित करने के संकलक के क्रम में पालन करना चाहिए रहे हैं।

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

तकनीकी रूप से उन सभी को यादृच्छिक क्रम में अनुमति देना संभव होगा, लेकिन इससे कोड कम पठनीय हो जाएगा।

2

बस इसलिए कि भाषा इस तरह डिज़ाइन की गई है। कारण शायद यह है कि एक वर्ग में केवल एक आधार वर्ग हो सकता है, लेकिन किसी भी इंटरफेस को लागू कर सकता है।

2

क्योंकि आप केवल एक वर्ग का विस्तार कर सकते हैं और एक से अधिक इंटरफ़ेस लागू कर सकते हैं, कक्षा को पहले पढ़ने में आसान बनाते हैं। और शायद व्याकरण ही कि जिस तरह से लिखने के लिए easyer है, बस एक छद्म व्याकरण हो सकता है:

class CLASSNAME:baseclass? interface* 

वैकल्पिक कई इंटरफेस के बाद baseclass अर्थ, एक व्याकरण है कि सिर्फ एक वर्ग कहीं गड़बड़ बिना किसी कारण के मुश्किल होगा अनुमति देने के लेखन ।

+0

मैं सहमत हूं - यह व्याकरण को निर्दिष्ट करने के लिए बहुत आसान बनाता है। –

8

सी # केवल एकल विरासत का समर्थन करता है, लेकिन कक्षाएं कई इंटरफेस को लागू करने की अनुमति देता है। यह मामला है, इंटरफेस के गुच्छा के साथ मिश्रित होने के बजाय, हमेशा एक ही स्थान पर निर्दिष्ट बेस क्लास को निर्दिष्ट करने के लिए यह बहुत स्पष्ट है।

सम्मेलन के बावजूद, the specification mandates that this is the case वैसे भी, यही कारण है कि आप उस त्रुटि को देख रहे हैं।

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

class MyDerivedClass : A, B, C, D, E // which is the base class? 
{ 
... 
} 
1

आप केवल एक आधार वर्ग लेकिन कई इंटरफेस से विरासत कर सकते हैं। तो यदि सूचीबद्ध एक से अधिक प्रकार हैं तो आप जानते हैं कि पहला वर्ग एक वर्ग है, अन्य इंटरफेस करते हैं।इस वर्ग/इंटरफेस नामकरण सम्मेलनों की परवाह किए बिना काम करता है

1

आदेश बनाता स्पष्ट अर्थ, आधार वर्ग इंटरफेस के सदस्यों व्युत्पन्न वर्ग के लिए, लागू कर सकते हैं इसलिए संकलक उनमें से पहले से

+0

@Mogsdad ठीक है, मैं इसे अभी उत्तर के रूप में छोड़ दूंगा .. –

+0

यह स्पष्ट रूप से बताता है और किसी भी पिछले उत्तर से बेहतर है "क्योंकि उन्होंने यही कहा" –

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

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