2013-03-14 7 views
11

से विरासत मैं यह पता लगाने की कोशिश कर रहा हूं कि समस्या मेरे कोड को कितनी समस्या है। मैं इस कोड है:संरचना

public struct MyStructA 
{ 
    public MyStructA(string str) 
    { 
     myString= str; 
    } 

    public string myString; 
} 

public struct MyStructB: MyStructA 
{ 
    public string myReversString; 
} 

और मैं इस त्रुटि मिलती है:

Error at compile time: Type 'MyStructA' in interface list is not an interface 

मैं क्यों समझ में नहीं आता? .NET कक्षा की तरह संरचना को लागू नहीं करता है?

+0

structs और वर्ग अलग हैं, कोई संरचना प्रकार वर्ग नहीं है, यह या तो एक या दूसरे है। – Freeman

+0

कुछ और होना चाहिए ... क्या यह आपका पूरा कोड है? –

उत्तर

16

एक struct उलझाव से बंद है

इस link के अनुसार:

हर struct सी # में, चाहे यह उपयोगकर्ता परिभाषित या .NET Framework में परिभाषित किया गया है, का अर्थ है कि आप इससे प्राप्त नहीं कर सकते हैं। एक संरचना को सील कर दिया गया है क्योंकि यह एक मूल्य प्रकार है और सभी मूल्य प्रकार सील कर दिए गए हैं।

एक संरचना एक इंटरफ़ेस को कार्यान्वित कर सकती है, इसलिए संरचना के नाम के बाद, कोलन के बाद एक और प्रकार का नाम देखना संभव है।

नीचे दिए गए उदाहरण में, हम एक संकलित-समय त्रुटि प्राप्त करते हैं जब हम उपरोक्त परिभाषित एक नई संरचना को परिभाषित करने का प्रयास करते हैं।

public struct PersonName 
{ 
    public PersonName(string first, string last) 
    { 
     First = first; 
     Last = last; 
    } 

    public string First; 
    public string Last; 
} 

// Error at compile time: Type 'PersonName' in interface list is not an interface 
public struct AngryPersonName : PersonName 
{ 
    public string AngryNickname; 
} 
3

Struct विरासत का समर्थन नहीं करता है, अगर आप की जरूरत है आप वर्ग का उपयोग करने के लिए है, को देखने के msdn

There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object. A struct can implement interfaces, and it does that exactly as classes do.

+1

उत्कृष्ट उत्तर; Tanx –

1

structs के बीच विरासत की अनुमति नहीं है लेकिन structs इंटरफेस को कार्यान्वित कर सकते हैं।

1

MSDN से;

There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object. A struct can implement interfaces, and it does that exactly as classes do.

लेकिन, याद के बाद से structs एक मान प्रकार हैं और वे वारिस System.ValueType

1

Structs एक इंटरफ़ेस को लागू कर सकते हैं, लेकिन वे एक और struct से विरासत नहीं कर सकते। इसी कारण से, संरचना सदस्यों को संरक्षित घोषित नहीं किया जा सकता है।

2

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

यह कुछ विशेष नियमों के साथ मूल्य-प्रकार उत्तराधिकार के कुछ सीमित रूप में अनुमति देने के लिए .net के लिए धारणात्मक संभव (और उपयोगी) होगा ऐसी है कि, जबकि एक BaseStructure चर केवल एक BaseStructure पकड़ सकता है और एक DerivedStructure पकड़ नहीं कर सकता है, कोई StructureUser<T> where T:BaseStructure परिभाषित कर सकता है, और ऐसी कक्षा या विधि BaseStructure के व्युत्पन्न को स्वीकार कर सकती है और उन सदस्यों का उपयोग कर सकती है - फ़ील्ड समेत - जो मूल प्रकार के लिए आम थीं।दुर्भाग्यवश, जेनेरिकों के नियमों को इस तरह से परिभाषित करना मुश्किल होगा कि अनुमत परिदृश्यों में लगातार व्यवहार करना और फिर भी कोई मौजूदा कोड तोड़ना न पड़े। उदाहरण के लिए, एक वर्ग के भीतर Foo<T,U> where T:U यह हमेशा संभव, प्रकार U के एक चर करने के लिए एक T स्टोर करने के लिए भले ही U एक मान प्रकार (उस स्थिति में है, क्योंकि मूल्य प्रकार सील कर रहे हैं, T और Uही होने की गारंटी कर रहे हैं प्रकार)। यदि U विरासत योग्य मान प्रकार हो सकता है और T व्युत्पन्न हो सकता है, तो ऐसी गारंटी नहीं होगी। ऐसी विरासत से जुड़ी कठिनाइयों को देखते हुए, एक अधिक उपयोगी विकल्प एक सुरक्षित (भले ही सीमित) माध्यम प्रदान करना होगा जिसके माध्यम से एक संपत्ति एक बायफ या एक कॉन्स-बायफ का पर्दाफाश कर सकती है (एक बायफ वह चीज है जो पैरामीटर का उपयोग करता है एक ref योग्यता)। इस तरह की एक विशेषता फ़ील्ड और गुणों के बीच अपरिहार्य अर्थात् भेद को हटा देगी, और यह लागू करने के तरीके के आधार पर कक्षाओं के साथ उपयोग किए जाने पर भी कुछ प्रमुख फायदे प्रदान कर सकते हैं (उदाहरण के लिए, यह अपरिवर्तनीय और परिवर्तनीय प्रकारों के कुशल मिश्रण की अनुमति दे सकता है)।