2009-10-21 8 views

उत्तर

65

क्योंकि सबक्लास के हर उदाहरण को अभी भी बेस क्लास का वैध उदाहरण होना चाहिए (Liskov substitution principle देखें)।

यदि उपclass अचानक बेस वर्ग की एक संपत्ति खो गया है (अर्थात् उदाहरण के लिए एक सार्वजनिक विधि) तो यह अब बेस क्लास के लिए एक वैध विकल्प नहीं होगा।

+2

लेकिन हमें संरक्षित विधि को ओवरराइड करने और इसे निजी में बदलने की अनुमति क्यों नहीं है? चूंकि सार्वजनिक इंटरफ़ेस अभी भी वही है, इसलिए यह इस तरह से एलएसपी को तोड़ नहीं देता है। – Pacerier

+0

सार्वजनिक इंटरफ़ेस नहीं बदलता है, लेकिन संरक्षित करता है। अभिभावक वर्ग में कोड अपने शरीर और रक्त के तरीकों तक नहीं पहुंच सकता है :( – Elazar

1

क्योंकि उपप्रकारों को उनके सुपरटेप के उदाहरणों के रूप में उपयोग करने योग्य होना चाहिए।

18

क्योंकि अगर यह अनुमति दी गई थी, तो निम्न स्थिति संभव होगा:

वर्ग जनक से कक्षा उप इनहेरिट करती है। अभिभावक की सार्वजनिक विधि foo है, उप उस विधि को निजी बनाता है। अब निम्नलिखित कोड है, ठीक संकलन होगा क्योंकि bar की घोषित प्रकार जनक है:

Parent bar = new Sub(); 
bar.foo(); 

हालांकि यह स्पष्ट नहीं है कि यह कैसे व्यवहार करना चाहिए। एक संभावना यह एक रनटाइम त्रुटि का कारण बनने के लिए होगा। एक और इसे बस अनुमति देने की अनुमति होगी, जिससे माता-पिता वर्ग को सिर्फ कास्टिंग करके, बाहर से एक निजी विधि को कॉल करना संभव हो जाएगा। इनमें से कोई भी विकल्प स्वीकार्य नहीं है, इसलिए इसकी अनुमति नहीं है।