2009-08-05 13 views
7

जावा, सी #, सी ++ और PHP में एक्सेस स्तर के बारे में एक आम गलतफहमी यह है कि यह कक्षाओं के बजाय वस्तुओं पर लागू होती है। यही है, कि (कहें) कक्षा एक्स का एक वस्तु किसी अन्य एक्स के निजी सदस्यों को नहीं देख सकता है। असल में, निश्चित रूप से, पहुंच स्तर कक्षा-आधारित है और एक एक्स ऑब्जेक्ट आसानी से दूसरे के निजी सदस्यों को संदर्भित कर सकता है।क्या ऑब्जेक्ट-आधारित पहुंच के स्तर वाली कोई भाषा है?

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

+0

मैंने क्लास-आधारित पहुंच स्तर को लागू करने वाली भाषाओं की सूची में PHP जोड़ने की स्वतंत्रता ली। –

उत्तर

6

रूबी के पास ऑब्जेक्ट-आधारित पहुंच स्तर है। यहाँ प्रोग्रामिंग रूबी के एक संदर्भ से है:

के बीच अंतर "संरक्षित" और "निजी" काफी सूक्ष्म है, और सबसे आम OO भाषाओं में से रूबी में अलग है। यदि कोई विधि संरक्षित है, तो इसे किसी भी परिभाषित वर्ग या उसके सबक्लास के उदाहरण के द्वारा बुलाया जा सकता है। एक विधि निजी है, तो यह केवल बुला वस्तु के संदर्भ भीतर बुलाया जा सकता है --- यह सीधे किसी अन्य वस्तु के निजी तरीकों का उपयोग करने में कभी नहीं संभव है, भले ही वस्तु के रूप में एक ही कक्षा की है फोन करने वाले। जावा और रूबी के बीच http://whytheluckystiff.net/ruby/pickaxe/html/tut_classes.html#S4

उदाहरण अंतर

जावा

public class Main { 
    public static void main(String[] args) { 
     Main.A a1 = new A(); 
     Main.A a2 = new A(); 

     System.out.println(a1.foo(a2)); 
    } 

    static class A 
    { 
     public String foo(A other_a) 
     { 
      return other_a.bar(); 
     } 

     private String bar() 
     { 
      return "bar is private"; 
     } 
    } 
} 

// Outputs 
// "bar is private" 

रूबी

class A 
    def foo other_a 
    other_a.bar 
    end 

    private 
    def bar 
    "bar is private" 
    end 
end 

a1 = A.new 
a2 = A.new 

puts a1.foo(a2) 

# outputs something like 
# in `foo': private method `bar' called for #<A:0x2ce9f44> (NoMethodError) 
:

और यहाँ स्रोत है

+0

क्या आप उद्धरण प्रदान कर सकते हैं? –

+0

मैं अभी भी इसकी तलाश कर रहा हूं। –

+0

इस अर्थ में "निजी" वास्तव में मॉड्यूलर लगता है। मुझे आशा है कि अन्य भाषाएं समान कार्यक्षमता उठाएंगी। – Imagist

-1

आप इसे सी # में लागू कर सकते हैं जिसमें स्टैक चलने में सक्षम कुछ तरीका है और यह जांचने में सक्षम है कि कॉलर कौन सा ऑब्जेक्ट है, और अपवाद फेंक रहा है यदि यह वर्तमान वर्ग नहीं है। मुझे नहीं पता कि तुम क्यों चाहोगे, लेकिन मैंने सोचा कि मैं इसे वहां फेंक दूंगा।

+0

स्पष्टीकरण: यह बात संकलन समय पर किया जाना चाहिए। रनटाइम पर यह बेकार है। – EFraim

+0

Wtf ने इसे कम किया है? यह एक वैध उत्तर है ... –

+0

नहीं, यह एक प्रतिवर्तन है। भयानक रनटाइम ओवरहेड, और बिल्कुल गलत विधि का उपयोग करना। – EFraim

0

अर्थात् स्तर पर इस भाषा के लिए कोई भी भाषा का समर्थन करने का मुख्य कारण यह नहीं है कि इस तरह की सुविधा के लिए पर्याप्त आम एक सामान्य संप्रदाय को खोजने के लिए विभिन्न आवश्यकताएं बहुत अलग हैं। डेटा छिपाना उतना ही खराब है जितना कि यह है, और जब आपको और अधिक बढ़िया दाग नियंत्रण की आवश्यकता होती है तो यह केवल बदतर हो जाता है।

ऐसी भाषा के फायदे होंगे, उदाहरण के लिए, आप किसी भी डेटा के लिए निजी डेटा को चिह्नित कर सकते हैं लेकिन ऑब्जेक्ट जिसने इसे बनाया है (पासवर्ड एक महान उदाहरण होगा: उसी एप्लिकेशन में चलने वाला कोड भी उन्हें पढ़ नहीं सकता)।

दुर्भाग्य से, यह "सुरक्षा" असेंबलर स्तर पर सतही होगा, सुरक्षा मौजूद नहीं होगी। कुशल होने के लिए, हार्डवेयर को इसका समर्थन करने की आवश्यकता होगी। इस मामले में, शायद राम में एक बाइट के स्तर पर। इससे ऐसा एप्लिकेशन बेहद सुरक्षित और दर्दनाक धीमा हो जाएगा।

असली दुनिया में, आप इसे अपने मुख्य बोर्ड पर TPM chip में और सीपीयू के एमएमयू टेबल के साथ, बहुत मोटे रूप में पाएंगे। लेकिन यह एक 4 के पेज स्तर पर है, बाइट स्तर पर नहीं। दोनों को संभालने के लिए पुस्तकालय हैं लेकिन यह "भाषा समर्थन" आईएमओ के रूप में नहीं गिना जाता है।

जावा के पास Security API के रूप में ऐसा कुछ है। आपको प्रश्न में कोड को एक अभिभावक में लपेटना चाहिए जो मौजूदा SecuityManager से पूछता है कि पहुंच की अनुमति है या नहीं।

पायथन में, आप सजावटकर्ताओं (विधियों और कार्यों के लिए) के समान कुछ प्राप्त कर सकते हैं या __setattr__ और __getattr__ को फ़ील्ड एक्सेस के लिए लागू कर सकते हैं।

+3

आपका विश्लेषण एक अर्थ में मान्य है, लेकिन आप "डेटा सुरक्षा" के साथ "डेटा encapsulation" भ्रमित कर रहे हैं। ओओपी भाषाओं में सार्वजनिक, संरक्षित और निजी संशोधक डेटा को "सुरक्षित" करने के लिए नहीं बल्कि एक वर्ग में डेटा को समाहित करने के लिए, और अन्य वर्गों द्वारा इसे बदलने से "रक्षा" करने के लिए नहीं हैं। संशोधक सूचना सुरक्षा अर्थ में डेटा को "सुरक्षित" करने के लिए नहीं हैं। – mipadi

+0

यदि सुरक्षा नहीं है तो ऐसी सुविधा का क्या बिंदु होगा? डेटा encapsulation के लिए, "निजी" पर्याप्त है क्योंकि आप एक ही कक्षा के अन्य उदाहरणों से इसे सुरक्षित रखने के लिए हमेशा कक्षा में एक ही क्षेत्र को लपेट सकते हैं। –

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