2010-02-04 7 views
17

मेरे पास User कक्षा के डिज़ाइन से संबंधित कुछ प्रश्न हैं लेकिन वे अलग हैं जो मुझे लगता है कि उन्हें स्वतंत्र होना चाहिए प्रश्न।तीन बेस क्लास प्राप्त करने का प्रयास कर रहे हैं और

तो, पहले आधार वर्ग की विरासत से संबंधित है। मैं वर्तमान में जैसे दो वर्गों, ProfileBase और ISessionMgrEntry इनहेरिट हूँ:

public class User : ProfileBase, ISessionMgrEntry 

लेकिन, मैं भी एक तृतीय श्रेणी, MembershipUser, इस तरह के वारिस हैं:

public class User : ProfileBase, MembershipUser, ISessionMgrEntry 

हालांकि, संकलक जीता ' मुझे ऐसा करने दो। क्यूं कर? और, मैं इसके आसपास कैसे प्राप्त करूं?

धन्यवाद।

पुनश्च - ASP.NET 3.5/सी #

संपादित

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

public class User 
    { 

     #region Constructors 
      private readonly MembershipUser _MembershipUser; 
      private readonly ProfileBase _ProfileBase; 
     #endregion 

     public User() 
     { 
      _MembershipUser = new MembershipUser(); 
      _ProfileBase = new ProfileBase(); 

     } 

     public string Comment 
     { 
      get { return _MembershipUser.Comment as string; } 
      set { _MembershipUser.Comment = value; } 
     } 

     public bool IsAnonymous 
     { 
      get { return _ProfileBase.IsAnonymous as bool; } 
     } 

     .... 

    } 
+0

क्यों आप प्रोप पर 'as' करते हैं? – ChaosPandion

+0

आप सही हैं, मैंने सोचा कि देखा गया। मैं इस सम्मेलन का पालन कर रहा था लेकिन महसूस किया कि यह एक अलग मामला है: [सेटिंग्सअलोवनाम (झूठा), कस्टमप्रोवाइडरडाटा ("आईपीएड्रेस; स्ट्रिंग")] सार्वजनिक स्ट्रिंग आईपीएड्रेस {स्ट्रिंग के रूप में {वापसी आधार ["आईपीएड्रेस"] प्राप्त करें; } सेट {आधार ["IPAddress"] = मान; }} –

उत्तर

28

पहला उदाहरण आप वास्तव में दो वर्गों से इनहेरिट नहीं कर रहे हैं में, लेकिन एक वर्ग और एक अंतरफलक से।

सी # वर्गों से एकाधिक वंशानुक्रम की अनुमति नहीं है, लेकिन आप कई इंटरफेस को लागू करने की अनुमति मिल जाएगी। क्यों अधिक जानकारी के लिए this MSDN blog post देखें।

आपको IMembershipUser इंटरफ़ेस बनाना होगा और इसे अपने User कक्षा में लागू करना होगा।

इंटरफेस आम तौर पर एक I लगाया जाता ठोस वर्ग के नाम के आधार पर नाम दिए गए हैं। तो कक्षा MembershipUser में इंटरफ़ेस IMembershipUser होगा। कुछ अन्य नामों का उपयोग करके आपको कुछ भी रोक नहीं रहा है, लेकिन इंटरफेस का उपयोग करने वाले हर किसी को इस नामकरण सम्मेलन में उपयोग किया जाता है।

+0

धन्यवाद क्रिस। क्या आपके पास एक पल होने पर मेरा संपादन देखने पर विचार कर सकता है? आपकी सहायता के लिए एक बार फिर से धन्यवाद। –

+1

@ कोड शेरपा - मुझे वास्तव में आपके अधिक कोड को देखने की आवश्यकता होगी और एसओ के माध्यम से संभवतः बातचीत की अधिक बातचीत होनी चाहिए, लेकिन अगर आपको डुप्लीकेट गुण मिल गए हैं तो आपको एक अलग श्रेणी पदानुक्रम को देखना चाहिए। – ChrisF

1

सी # एकाधिक विरासत का समर्थन नहीं करता है।

पहले उदाहरण में आप ProfileBase से विरासत में हैं और ISessionMgrEntry इंटरफ़ेस को कार्यान्वित करने के लिए अपनी कक्षा घोषित कर रहे हैं।

आप चाहते हैं के रूप में आप (आप उन सभी को लागू प्रदान की) एक वर्ग के रूप में कई इंटरफेस जोड़ सकते हैं।

3

सी # केवल एक विरासत का समर्थन करता है। आप या तो अपनी कक्षाओं को एक साथ जोड़ सकते हैं (यानी MembershipUserProfileBase से विरासत) या interfaces का उपयोग करें।

5

सी # में आप सिर्फ एक वर्ग से विरासत सकते हैं, लेकिन के रूप में आप चाहते हैं के रूप में कई इंटरफेस लागू। आपके मामले में ProfileBase और MembershipUser कक्षाएं हैं और ISessionMgrEntry एक इंटरफ़ेस है।

2

सी # केवल एकल विरासत की अनुमति देता है: आप केवल एक बेस क्लास से प्राप्त कर सकते हैं। पहले मामले में ISessionMgrEntry एक इंटरफेस है जो बेस क्लास से अलग है। http://msdn.microsoft.com/en-us/library/ms973861.aspx

दूसरे मामले आप ProfileBase और MembershipUser दोनों है, जो संकलक अनुमति नहीं दी जाएगी से विरासत की कोशिश कर रहे हैं: यहां अंतर पर एक अच्छा लेख है। इसके आस-पास जाने का सबसे अच्छा तरीका ProfileBase और MembershipUser के एक (या दोनों) को समाहित करना होगा।

0

समान सदस्य नामों के साथ एकाधिक इंटरफेस कोई समस्या नहीं है। यदि सदस्य समान कार्यान्वयन साझा कर सकते हैं, तो बस उसी नाम के साथ एक सार्वजनिक सदस्य बनाएं; अगर वे एक ही कार्यान्वयन साझा नहीं कर सकते हैं, तो आप सदस्यों के एक (या सभी) को स्पष्ट रूप से कार्यान्वित कर सकते हैं।

उदाहरण के लिए, IEnumerable<T> विरासत IEnumerable, और दोनों अलग-अलग रिटर्न प्रकारों के साथ GetEnumerator() विधि प्रदान करते हैं। नतीजतन, IEnumerable.GetEnumerator() आम तौर पर स्पष्ट रूप से कार्यान्वित किया जाता है:

class Foo : IEnumerable<object>{ 
    // explicitly implement IEnumerable.GetEnumerator() 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public IEnumerator<object> GetEnumerator() 
    { 
     yield break; 
    } 
} 

कॉलिंग IEnumerable.GetEnumerator() में GetEnumerator() एक असीम पुनरावर्ती कॉल नहीं है, यह उसी नाम के सार्वजनिक सदस्य को कॉल करता है, स्वयं (यानी IEnumerable.GetEnumerator() विधि)।

+0

धन्यवाद आदमी - जिसने इसे मेरे लिए हल किया। बहुत सराहना की! –

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