class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
यह कोड सी # और PHP में समकक्ष कार्यों में संकलित करता है, लेकिन क्या कोई कारण बता सकता है कि otherTestClass._privateString
क्यों बदला जा सकता है?कक्षा के उदाहरण से निजी सदस्य चर क्यों बदला जा सकता है?
मैंने सोचा होगा कि किसी वर्ग के एक उदाहरण को किसी भी परिस्थिति में एक निजी सदस्य चर बदलने में सक्षम नहीं होना चाहिए, और otherTestClass._privateString
तक पहुंचने का प्रयास करने से 'सुरक्षा स्तर के कारण पहुंच योग्य' त्रुटि मिल जाएगी।
यह है मामला नहीं है, हालांकि, तो क्यों आप निजी सदस्यों तक पहुंचने देने के अपने ही वर्ग के अंदर एक वस्तु instantiating करता है? और यह चाहिए, यह एक हद तक इस ब्रेक encapsulation नहीं है? या क्या मुझे कुछ याद आ रही है?
- (मैं पूछ रहा हूँ नहीं करता है, तो ऊपर वर्ग डिजाइन अच्छा अभ्यास है, बस इसे पीछे सिद्धांत के बारे में सोच।)
संपादित - जवाब और टिप्पणियों के लिए धन्यवाद। स्पष्टीकरण के लिए, मुझे यह जानने में भी दिलचस्पी है कि ऐसा करने में सक्षम होने के नाते सकारात्मक सुविधा के रूप में माना जाता है, या यदि यह बेहतर संकलन-समय की जांच/कोड स्पष्टता के लिए एक आवश्यक व्यापारिक है/क्योंकि अधिकांश अन्य भाषाएं इस तरह या जो कुछ भी करती हैं। ऐसा लगता है कि आदर्श रूप से संकलक आपको इसके बारे में चेतावनी देगा या चेतावनी देगा, लेकिन फिर मैं एक भाषा डिजाइनर से बहुत दूर हूं। इस तरह से होने के तरीके के बारे में कोई भी उदाहरण आपको कुछ उपयोगी करने देता है (बिना encapsulation का उल्लंघन किए) जो अन्यथा मुश्किल या असंभव होगा।
बीटीडब्लू: आप 'चेंजडाटा() '' स्थिर' भी बना सकते हैं और आप अभी भी निजी सदस्यों तक पहुंच पाएंगे। – ulrichb
@ulrichb - ओपी के लिए नोट करना महत्वपूर्ण है कि आप 'चेंजडाटा() '' स्थिर' होने पर निजी सदस्यों तक पहुंचने के लिए 'इस' कीवर्ड का उपयोग नहीं कर सकते हैं। – TheCloudlessSky
रूबी में अलग-अलग भाषा का एक उदाहरण के रूप में, सार्वजनिक समान है, लेकिन निजी साधन "केवल उसी उदाहरण से सुलभ" हैं और संरक्षित साधन "केवल उसी वर्ग से पहुंच योग्य" हैं। विरासत में इसके साथ कुछ लेना देना नहीं है। – Tesserex