जब आप सबक्लास में ओवरराइड करते समय किसी विधि की दृश्यता को कम करते हैं तो संकलक एक त्रुटि संदेश क्यों देता है?जावा उपclass में किसी विधि की दृश्यता को कम क्यों नहीं कर सकते?
उत्तर
क्योंकि सबक्लास के हर उदाहरण को अभी भी बेस क्लास का वैध उदाहरण होना चाहिए (Liskov substitution principle देखें)।
यदि उपclass अचानक बेस वर्ग की एक संपत्ति खो गया है (अर्थात् उदाहरण के लिए एक सार्वजनिक विधि) तो यह अब बेस क्लास के लिए एक वैध विकल्प नहीं होगा।
क्योंकि उपप्रकारों को उनके सुपरटेप के उदाहरणों के रूप में उपयोग करने योग्य होना चाहिए।
क्योंकि अगर यह अनुमति दी गई थी, तो निम्न स्थिति संभव होगा:
वर्ग जनक से कक्षा उप इनहेरिट करती है। अभिभावक की सार्वजनिक विधि foo
है, उप उस विधि को निजी बनाता है। अब निम्नलिखित कोड है, ठीक संकलन होगा क्योंकि bar
की घोषित प्रकार जनक है:
Parent bar = new Sub();
bar.foo();
हालांकि यह स्पष्ट नहीं है कि यह कैसे व्यवहार करना चाहिए। एक संभावना यह एक रनटाइम त्रुटि का कारण बनने के लिए होगा। एक और इसे बस अनुमति देने की अनुमति होगी, जिससे माता-पिता वर्ग को सिर्फ कास्टिंग करके, बाहर से एक निजी विधि को कॉल करना संभव हो जाएगा। इनमें से कोई भी विकल्प स्वीकार्य नहीं है, इसलिए इसकी अनुमति नहीं है।
लेकिन हमें संरक्षित विधि को ओवरराइड करने और इसे निजी में बदलने की अनुमति क्यों नहीं है? चूंकि सार्वजनिक इंटरफ़ेस अभी भी वही है, इसलिए यह इस तरह से एलएसपी को तोड़ नहीं देता है। – Pacerier
सार्वजनिक इंटरफ़ेस नहीं बदलता है, लेकिन संरक्षित करता है। अभिभावक वर्ग में कोड अपने शरीर और रक्त के तरीकों तक नहीं पहुंच सकता है :( – Elazar