2015-12-25 10 views
5

मेरी परियोजनाओं के भीतर मैं अक्सर एक विधि (या यदि आप चाहें तो फ़ंक्शन) करना चाहते हैं, तो यह निजी है, हालांकि मैं इसे एक अन्य कक्षा से भी एक्सेस करना चाहता हूं। क्या यह एक संभावना है?निजी-आश विधि?

स्पष्ट करने के लिए, इस विधि ClassA, अपने ही वर्ग नहीं बल्कि किसी अन्य से पहुँचा जा सकता।

+2

यदि आप दोनों कक्षाओं को केवल उन दो वर्गों को समर्पित असेंबली में डालते हैं, तो आप 'आंतरिक' का उपयोग कर सकते हैं। लेकिन ... आप पुनर्विचार करना चाहेंगे कि आपको ऐसा करने की आवश्यकता क्यों है। –

+0

इस तरह के डिजाइन के पीछे तर्कसंगत क्या है? – dotctor

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/203616/why-does-c-sharp-not-provide-the-c-style-friend-keyword –

उत्तर

2

तरीके इस तक अपने पिछले बयान है कि "और केवल उस वर्ग" करने के लिए बहुत सारे हैं, मैं केवल 1 जिस तरह के बारे में सोच सकते हैं कि ऐसा करने के लिए है और यह इस तरह के रूप जैसे विधानसभाओं में बाहर रखी वर्गों है :

विधानसभा एक ही तरीका है कि आप आंतरिक रूप में घोषित करना चाहते हैं के साथ वर्ग ए में शामिल है

विधानसभा बी एक दोस्ताना विधानसभा के रूप में घोषित: https://msdn.microsoft.com/en-us/library/0tke9fxk.aspx और एक कॉल करने के लिए (यह यह करने के लिए के रूप में यह आंतरिक है सकते हैं कोड होता है के रूप में में अगर एक ही असेंबली के रूप में यह एक दोस्त असेंबली है)

ए, बी या दोनों से जुड़ी कोई अन्य असेंबली नहीं होगी कक्षा ए पर विधि को कॉल करने में सक्षम होने के रूप में यह आंतरिक है।

+0

मुझे लगता है कि यह करने का यही एकमात्र तरीका है। – dotctor

1

जो भी आप पूछ रहे हैं वह सी # में संभव नहीं है। मेरा मतलब है कि आप केवल एक वर्ग को निजी विधि का उपयोग करने की अनुमति नहीं दे सकते। आप बस internal का उपयोग कर सकते हैं जो केवल एक असेंबली के वर्गों को आपकी विधियों या protected तक पहुंचने की अनुमति देता है जो इसकी कक्षा के भीतर और व्युत्पन्न कक्षा के उदाहरणों के माध्यम से सुलभ है!

अलावा कि वहाँ आप क्या कह रहे हैं लेकिन आप कुछ हैक कर सकते हैं के लिए किसी भी अंगूठे का नियम नहीं है नीचे दिखाया गया है: वर्ग बी से एक विधि का उपयोग करने

MethodInfo privateMethod = instance.GetType().GetMethod("NameOfPrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance); 
privateMethod.Invoke(instance, new object[] { methodParameters }); 
0

एक थोड़ा गंदा चाल वर्ग एक है में विधि बल्कि निजी की तुलना में संरक्षित बनाने के लिए और बी

एक और संभावना से एक प्राप्त करने के लिए, शायद बेहतर, विधि आंतरिक बजाय निजी बनाने के लिए और उसके बाद ही विधानसभा में वर्ग ए और बी डाल है।

2

अगर यह सूट अपने OOP संरचना आप इस पद्धति संरक्षित कर सकते हैं,:

public class A 
{ 
    protected void Test() 
    { 
     Console.WriteLine("I can only be called from B"); 
    } 
} 

public class B : A 
{ 
    public void Pub() 
    { 
     Test(); 
    } 
} 

और वहाँ कई अन्य तरीकों से यह करने के लिए।

हालांकि, सामान्य रूप में, यह पहुँच संशोधक पर एक गलत नज़र तरह लगता है।
यदि आप केवल अपनी विधि को एक ही स्थान से कॉल करना चाहते हैं, तो बस इसे एक ही स्थान से कॉल करें।
तथ्य यह है कि इस विधि को किसी अन्य वर्ग से बुलाया जाना चाहिए, उसे सार्वजनिक, तार्किक और स्थापत्य रूप से बनाता है।

+0

'ए' से ली गई प्रत्येक कक्षा 'टेस्ट' विधि तक पहुंच सकती है। ओपी चाहता है "हालांकि मैं इसे एक अन्य वर्ग, और यह अन्य कक्षा से ही एक्सेस करना चाहता हूं!" – dotctor

2

यह सबसे अच्छा तरीका है जिसे मैं सोच सकता हूं।

सी # 5 में, फोन करने वाले के बारे में जानकारी विशेषताओं का एक सेट जोड़ा गया था, अर्थात् [System.Runtime.CompilerServices.CallerMemberName], [System.Runtime.CompilerServices.CallerFilePath], और [System.Runtime.CompilerServices.CallerLineNumber]। हम CallerFilePathAttribute का उपयोग देखने के लिए फोन करने वाले एक विशेष .cs फ़ाइल से आता है कि क्या कर सकते हैं।

आमतौर पर, एक फ़ाइल में केवल एक वर्ग या संरचना होगी। उदाहरण के लिए, ClassA को ClassA.cs में परिभाषित किया गया है। आप जांच सकते हैं कि कॉलर फ़ाइल का नाम विधि में ClassA.cs से मेल खाता है या नहीं। विधि में, अगर callerFilePathClassA की फ़ाइल पथ से मेल खाता है जाँच

([CallerFilePath] string callerFilePath = "" /*Other parameters*/) 

:

तो अपने विधि के पैरामीटर इस तरह संशोधित करते हैं। यदि ऐसा नहीं होता है, तो एक अपवाद फेंक दें कि विधि को केवल ClassA से एक्सेस किया जा सकता है!

+0

यह चेक केवल रनटाइम में किया जाता है। – dotctor

+0

हाँ ... मुझे पता है। लेकिन फिर भी, आप 'कक्षा' के अलावा किसी वर्ग में विधि का उपयोग नहीं कर सकते हैं। तो यह आवश्यकताओं को पूरा करता है! @ डॉटक्टर – Sweeper

1

प्रतिनिधियों उपयोग कर रहा है सदस्य पहुँच को नियंत्रित करने के लिए एक आसान तरीका।

class SecureMethod { 
    private void DoSomething() { } 
} 

आप इस पद्धति के लिए प्रतिनिधि इंजेक्शन लगाने के द्वारा इस विधि के लिए पहुँच प्रदान कर सकते हैं:: मान लेते हैं तो आप के लिए एक निजी विधि करते हैं

class ClassA { 
public ClassA(Action secureMethod) { } 
} 

SecureMethod objWithSecureMethod; 
var a = new ClassA(objWithSecureMethod.DoSomething); 
1

मैं तुम्हें दिखा रहा हूँ कि यह कैसे करने के लिए करते हैं, लेकिन इन कर रहे हैं बहुत बुरा व्यवहार:

public class A 
{ 
    private void CanOnlyCallMethodInClassB(); 
    public static void SetHandlerCanOnlyCallMethodInClassB(ClassB b) 
    { 
     b.MethodFromClassA = CanOnlyCallMethodInClassB; 
    } 
} 
public class B 
{ 
    public Action MethodFromClassA { get; set; } 
} 
कोड में

:

var b = new B(); 
A.SetHandlerCanOnlyCallMethodInClassB(b); 
b.MethodFromClassA(); 

लेकिन बेहतर तरीका विधि वर्ग में क्लासबी की वस्तु का उपयोग करना है। रणनीति पैटर्न के लिए Google पर खोजें या विरासत का उपयोग करें।