कुछ ने सुझाव दिया है कि दोस्त का उपयोग करके चीजें नियंत्रण से बाहर हो सकती हैं। मैं सहमत हूँ, लेकिन इसकी उपयोगिता कम नहीं है। मुझे यकीन नहीं है कि दोस्त जरूरी ओओ प्रतिमान को आपके सभी वर्ग के सदस्यों को सार्वजनिक करने से अधिक चोट पहुंचाते हैं। निश्चित रूप से भाषा आपको अपने सभी सदस्यों को सार्वजनिक करने की अनुमति देगी, लेकिन यह एक अनुशासित प्रोग्रामर है जो उस प्रकार के डिज़ाइन पैटर्न से बचता है। इसी तरह एक अनुशासित प्रोग्रामर विशिष्ट मामलों के लिए मित्र के उपयोग को आरक्षित करेगा जहां यह समझ में आता है। मुझे लगता है कि कुछ मामलों में आंतरिक उजागर बहुत अधिक है। विधानसभा में हर चीज के लिए एक वर्ग या विधि क्यों उजागर करें?
मेरे पास एक ASP.NET पेज है जो मेरे अपने आधार पेज को इनहेरिट करता है, जो कि बदले में System.Web.UI.Page को विरासत में देता है। इस पृष्ठ में, मेरे पास कुछ कोड हैं जो एक संरक्षित पद्धति में एप्लिकेशन के लिए अंतिम-उपयोगकर्ता त्रुटि रिपोर्टिंग को संभालता है
ReportError("Uh Oh!");
अब, मेरे पास एक उपयोगकर्ता नियंत्रण है जो पृष्ठ में निहित है। मैं चाहता हूं कि उपयोगकर्ता नियंत्रण पृष्ठ में त्रुटि रिपोर्टिंग विधियों को कॉल करने में सक्षम हो।
MyBasePage bp = Page as MyBasePage;
bp.ReportError("Uh Oh");
यह नहीं हो सकता कि यदि ReportError विधि सुरक्षित है। मैं इसे आंतरिक बना सकता हूं, लेकिन यह विधानसभा में किसी भी कोड के संपर्क में है। मैं बस यूआई तत्वों से अवगत कराना चाहता हूं जो वर्तमान पृष्ठ (बच्चे के नियंत्रण सहित) का हिस्सा हैं। अधिक विशेष रूप से, मैं चाहता हूं कि मेरा आधार नियंत्रण वर्ग ठीक उसी त्रुटि रिपोर्टिंग विधियों को परिभाषित करे, और बस आधार पेज में तरीकों को कॉल करे।
protected void ReportError(string str) {
MyBasePage bp = Page as MyBasePage;
bp.ReportError(str);
}
मेरा मानना है कि भाषा को कम "ओओ" बनाने के बिना मित्र की तरह कुछ उपयोगी और कार्यान्वित किया जा सकता है, जैसे कि विशेषताओं के रूप में, शायद इसलिए कि आपके पास कक्षाएं या विधियां विशिष्ट कक्षाओं या विधियों के दोस्त हो सकते हैं, जिससे डेवलपर को बहुत सुविधा मिल सकती है। विशिष्ट पहुंच। शायद कुछ इस तरह ... (छद्म कोड)
[Friend(B)]
class A {
AMethod() { }
[Friend(C)]
ACMethod() { }
}
class B {
BMethod() { A.AMethod() }
}
class C {
CMethod() { A.ACMethod() }
}
मेरे पिछले उदाहरण के मामले में शायद निम्नलिखित की तरह कुछ है (एक शब्दार्थ पर बहस कर सकते हैं, लेकिन मैं सिर्फ इस विचार को प्राप्त करने की कोशिश कर रहा हूं:
class BasePage {
[Friend(BaseControl.ReportError(string)]
protected void ReportError(string str) { }
}
class BaseControl {
protected void ReportError(string str) {
MyBasePage bp = Page as MyBasePage;
bp.ReportError(str);
}
}
जैसा कि मैं इसे देखता हूं, दोस्त की अवधारणा को चीजों को सार्वजनिक करने, या सदस्यों तक पहुंचने के लिए सार्वजनिक तरीके या गुण बनाने की तुलना में इससे अधिक जोखिम नहीं है। अगर कोई भी दोस्त डेटा की पहुंच में एक और स्तर की बारीकियों की अनुमति देता है और आपको आंतरिक या सार्वजनिक के साथ व्यापक बनाने के बजाय उस एक्सेसिबिलिटी को कम करने की अनुमति देता है।