2012-07-14 6 views
9

ओवरराइड करते समय किसी विधि के दायरे को कम करने की अनुमति क्यों नहीं है, जब मैं किसी विधि को ओवरराइड करता हूं तो संकलक दृश्यता को एक त्रुटि के रूप में कम करने के किसी भी प्रयास को ध्वस्त करता है। पूर्व के लिए: मैं एक सार्वजनिक विधि को सुरक्षित के रूप में ओवरराइड नहीं कर सकता, जबकि मैं एक संरक्षित विधि को सार्वजनिक रूप से ओवरराइड कर सकता हूं।जावा में

मुझे इस नियम के पीछे डिजाइन निर्णय/सोच जानने में दिलचस्पी है।

+0

इस प्रश्न को कुछ दिन पहले पूछा गया था, लेकिन क्या बात होगी? –

+1

http://stackoverflow.com/q/11343763/1475461 इस मुद्दे पर चर्चा के लिए देखें जो पिछले हफ्ते –

उत्तर

14

एक उप-वर्ग हमेशा सुपरक्लास के अनुबंध को पूरा करना चाहिए। Liskov Substitution principle देखें।

विधियों की दृश्यता इस अनुबंध का हिस्सा है। तो सुपरक्लास में सार्वजनिक रूप से दिखाई देने वाली कुछ भी उप-वर्ग में सार्वजनिक होनी चाहिए।

+1

सोलिड उत्तर पर था! –

14

B पर विचार करें जो A से प्राप्त होता है। A.m() सार्वजनिक है। अब इस कोड पर विचार करें:

A obj = new B(); 
obj.m(); 

क्या इस कॉल की अनुमति होनी चाहिए? हां, यह चाहिए, क्योंकि objA प्रकार का एक वस्तु है! यह B प्रकार का एक ऑब्जेक्ट भी है, लेकिन यह ऑब्जेक्ट का उपयोग करके किसी के लिए जरूरी नहीं है।

A के प्रत्येक ऑब्जेक्ट को A के लिए अनुबंध (इंटरफ़ेस) का पालन करना होगा। BA बढ़ाता है और इसलिए उस अनुबंध का भी पालन करना चाहिए।

3

पहुंच स्तर को मुक्त या कार्यान्वित करने के दौरान, हमें उसी पहुंच स्तर या उस पहुंच स्तर तक व्यापक होना चाहिए।

private < (default) < protected < public 

सार्वजनिक व्यापक स्तर है।

इंटरफ़ेस में सभी सदस्य डिफ़ॉल्ट सार्वजनिक हैं। इसलिए, मजाक करने या खत्म करने के दौरान हमें केवल जनता के लिए जाना है।

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