2008-12-05 21 views
11
class MyBase 
{ 
    protected object PropertyOfBase { get; set; } 
} 

class MyType : MyBase 
{ 
    void MyMethod(MyBase parameter) 
    { 
     // I am looking for: 
     object p = parameter.PropertyOfBase; // error CS1540: Cannot access protected member 'MyBase.PropertyOfBase' via a qualifier of type 'MyBase'; the qualifier must be of type 'MyType' (or derived from it) 
    } 
} 

क्या प्रतिबिंब के बिना एक विस्तार प्रकार से किसी प्रकार के पैरामीटर की संरक्षित संपत्ति प्राप्त करने का कोई तरीका है? चूंकि विस्तारित वर्ग अपने मूल प्रकार के माध्यम से संपत्ति के बारे में जानता है, इसलिए यदि संभव हो तो यह समझ में आ जाएगा।क्या व्युत्पन्न प्रकार से किसी अन्य ऑब्जेक्ट के 'संरक्षित' सदस्य तक पहुंचने का कोई तरीका है?

+0

सुरक्षित के बजाय इसे सार्वजनिक बनाएं। – dalle

+0

क्या होगा यदि मैं नहीं चाहता कि यह अन्य वर्गों से सुलभ हो, जिनके पास PropertyOfBase से कोई लेना देना नहीं है? –

+0

इसे आंतरिक बनाओ? – dalle

उत्तर

11

नहीं, आप यह नहीं कर सकते हैं।

आपको केवल एक्सेसिंग प्रकार (या इससे प्राप्त) की वस्तुओं के संरक्षित सदस्यों तक पहुंचने की अनुमति है। यहां, हम नहीं जानते कि पैरामीटर MyType या SomeOtherCompletelyDifferentType प्रकार का है या नहीं।

संपादित करें: सी # 3.0 कल्पना की प्रासंगिक बिट खंड 3.5.3 है:

एक संरक्षित उदाहरण सदस्य वर्ग के कार्यक्रम पाठ जिसमें यह घोषित किया जाता है के बाहर पहुँचा दिया जाता है, और जब एक संरक्षित आंतरिक उदाहरण सदस्य कार्यक्रम में यह घोषित है के कार्यक्रम पाठ के बाहर पहुंचा जा सकता है, का उपयोग एक वर्ग घोषणा कि वर्ग जिसमें यह घोषित है से निकला भीतर जगह रखना चाहिए। इसके अलावा, का उपयोग उस व्युत्पन्न वर्ग प्रकार या से निर्मित वर्ग प्रकार के उदाहरण के माध्यम से होने के लिए आवश्यक है। प्रतिबंध अन्य व्युत्पन्न कक्षाओं के संरक्षित सदस्यों तक पहुंचने से एक व्युत्पन्न कक्षा को अन्य व्युत्पन्न कक्षाओं को प्रतिबंधित करने से रोकता है, भले ही सदस्यों को उसी बेस क्लास से विरासत में मिला हो।

+1

हम नहीं जानते कि यह मायटाइप या कुछ अन्य कॉम्प्लेटीली डिफेंडर टाइप है लेकिन हम जानते हैं कि यह माइबेस है और हम जानते हैं कि माईबेस के पास PropertyOfBase नाम की एक संपत्ति है, इसलिए यह अभी भी मुझे समझ में आता है। –

+0

spec असहमत :) यह संरक्षित पहुंच का परिभाषित अर्थ है। –

+0

वाह, यह डिजाइन द्वारा असंभव है। धन्यवाद। –

1

एक संरक्षित संपत्ति व्युत्पन्न कक्षाओं के उदाहरणों के लिए केवल व्युत्पन्न कक्षा के उदाहरण के लिए सुलभ है।

एक अंतर है और यह समझ में आता है, संरक्षित सदस्यों को किसी भी अन्य उदाहरण के लिए अपना मूल्य नहीं छोड़ना चाहिए, यहां तक ​​कि एक ही प्रकार से प्राप्त एक उदाहरण भी।

+0

लेकिन यदि पैरामीटर माईटाइप का था, तो यह इस उदाहरण के लिए सुलभ होगा और यह स्पष्ट रूप से एक "अन्य" उदाहरण है। –

+0

अच्छी तरह से कहा, मुझे नहीं पता था कि काम करेगा! – user42467

5

(संपादित, अपने आप को थोड़ा जीभ बंधे! मिल गया) वहाँ एक अच्छा कारण है कि आप ऐसा नहीं कर सकते है। मान लीजिए किसी लिखते हैं: भाषा अनुमति आप जो चाह रहे हैं

class Other : MyBase { } 

new MyType().MyMethod(new Other()); 

हैं, तो आप PropertyOfBase का मूल्य को संशोधित करके Other का ग्रहण अपरिवर्तनशीलताओं का उल्लंघन कर सकता है।

2

मुझे लगता है कि अगर आप ऐसा करना चाहते हैं तो बेहतर तरीके से पूछना चाहिए कि आपको खुद से पूछना चाहिए। आप PropertyOfBase को MyType.MyMethod() के संदर्भ में सार्वजनिक रूप से कार्य करना चाहते हैं, लेकिन अन्य सभी स्थितियों में संरक्षित होना चाहते हैं। क्यूं कर?

class MyBase 
{ 
    protected object PropertyOfBase { get; set; } 

    protected static object GetPropertyOfBaseOf(MyBase obj) 
    { 
     return obj.PropertyOfBase; 
    } 
} 

class MyType : MyBase 
{ 
    void MyMethod(MyBase parameter) 
    { 
     object p = GetPropertyOfBaseOf(parameter); 
    } 
} 
14

पिछली बार मैंने एक ऐसी ही समस्या का सामना करना पड़ा, मैं आधार के लिए एक संरक्षित स्थिर विधि जोड़ने के समाधान के लिए इस्तेमाल किया इसे "आधार" कीवर्ड का उपयोग करके "संरक्षित" के रूप में चिह्नित किया गया है।

public class MyBase 
{ 
    protected object PropertyOfBase { get; set; } 
} 

public class MyType : MyBase 
{ 
    void MyMethod() 
    { 
     object p = base.PropertyOfBase; 
    } 
} 
0

आप MyBase से इनहेरिट कर रहे हैं, आप सभी क्षेत्रों/गुण/से तरीकों का उपयोग कर सकते हैं:

0

तुम भी (बजाय इनहेरिट की) MyBase की एक नेस्टेड वर्ग, इस तरह से आप निजी/संरक्षित सदस्यों का उपयोग कर सकते है जब आप एक पैरामीटर के रूप में वर्ग MyBase भेजने के रूप में MyType घोषणा कर सकते हैं

public class MyBase 
{ 
    protected object PropertyOfBase { get; set; } 

    public class MyType 
    { 
     public void MyMethod(MyBase parameter) 
     { 
      object p = parameter.PropertyOfBase; 
     } 
    } 
} 

करने के लिए MyType का एक उदाहरण बनाएं बस

var t = new MyBase.MyType(); 
t.MyMethod(new MyBase()); 
संबंधित मुद्दे

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