केवल आभासी तरीकों वास्तव में वर्ग उदाहरण के हिस्से हैं - आप this
कहा जाता है बस एक स्थिर विधि है कि एक तर्क ले जा रहा है के रूप में सभी अन्य तरीकों कल्पना कर सकते हैं।
तो जब आप इस अधिक स्पष्ट रूप से दिखाने के लिए कोड को फिर से लिखने (ध्यान दें कि मैं सी # का उपयोग कर रहा है, जावा थोड़ा अलग है, लेकिन इसी सिद्धांत ज्यादातर लागू होता है):
class A
{
private static void sayA(A @this)
{
"Hi from A".Dump();
}
public static void Test()
{
sayA(new B());
}
}
class B : A { }
यह यह बहुत आसान हो गया है अधिक स्पष्ट है कि विधि का दायरा क्या है - यह वास्तव में प्रकार के उदाहरण में केवल टाई प्रकार के लिए टाई नहीं है। कोई फर्क नहीं पड़ता कि आप new B().sayA()
या new A().sayA()
पर कॉल करते हैं, वही विधि कहा जाता है, बस एक अलग तर्क के साथ।
दूसरी ओर, आप B
के अंदर से कोड लिख रहे हैं, sayA
विधि बस से सुलभ नहीं है - फिर से, A.sayA(...)
, स्पष्ट रूप से दुर्गम है, क्योंकि यह A
को निजी है।
जब आप विधि को सार्वजनिक या संरक्षित करते हैं, और वर्चुअल (जावा में डिफ़ॉल्ट) करते हैं तो यह बदलता है। उस स्थिति में, जिसे वास्तविक विधि कहा जाता है उस रनटाइम प्रकार पर निर्भर करता है जिसे आप विधि को कॉल कर रहे हैं, संकलन-समय प्रकार नहीं, न ही उस स्कोप जिसे आप इसे कॉल करते हैं। इसका मतलब है कि new B().VirtualA()
संकलन-समय प्रकार अलग होने के बावजूद उसी विधि को ((A)new B()).VirtualA()
के रूप में कॉल करेगा। और निश्चित रूप से new A().VirtualA()
B
VirtualA
ओवरराइड के आधार पर (या नहीं हो सकता है) एक अलग विधि हो सकता है।
कक्षा 'बी' के तहत 'मुख्य' को ले जाएं और आपको संकलन त्रुटि मिलनी चाहिए। –
इस प्रश्न को वोट क्यों दिया जा रहा है? मुझे नहीं लगता कि सवाल किसी भी अंतर्दृष्टिपूर्ण विचार को उकसाता है। – 0xbaadf00d
क्या हमारे पास सामान्य नहीं है "मैं व्यवहार्यता को कैसे समझता हूं?" डुप्लिकेट के रूप में पहले से ही झंडा करने के लिए सवाल? यदि नहीं, तो शायद यह एक अच्छा सवाल है :) –