2012-10-24 6 views
19

मैं समझ क्यों हम इस कोड के उत्पादन प्राप्त करने में कठिनाइयों है। $ myfoo कक्षा फू का एक आबादी है। फू में कोई विधि नहीं है, जिसे टेस्ट() कहा जाता है, इसलिए यह इसे अपने मूल बार से बढ़ाता है। लेकिन परीक्षण के परिणाम() हैविरासत और दृश्यता पीएचपी

Bar::testPrivate 
Foo::testPublic 

क्या आप मुझे बता सकते हैं क्यों पहले Foo :: testPrivate, जब यह माता पिता की विधि बच्चे में ओवरराइड की गई है ना?

अग्रिम में बहुत बहुत धन्यवाद!

उत्तर

13

शायद क्योंकि testPrivate है, जैसा कि नाम पहले से ही पता चलता है, एक निजी विधि और विरासत में मिला नहीं किया जाएगा/वर्ग विरासत द्वारा ओवरराइट।

php.net मैनुअल पृष्ठ आप शायद स्पष्ट रूप से है कि कोड मिला है पर कहा गया है कि We can redeclare the public and protected method, but not private

तो, निम्नलिखित वास्तव में क्या होता है: बच्चे के वर्ग विधि testPrivate redeclare नहीं होगा, लेकिन इसके बजाय बनाता है यह स्वयं के संस्करण है अगर बच्चे ऑब्जेक्ट केवल "दायरा" में है। test() को मूल वर्ग में परिभाषित किया गया है, यह माता-पिता testPrivate तक पहुंच जाएगा।

यदि आप बच्चे कक्षा में test फ़ंक्शन को पुन: प्राप्त करेंगे, तो इसे ? testPrivate() विधि से बच्चों को एक्सेस करना चाहिए।

3

manual से:

सदस्य घोषित रूप में निजी केवल वर्ग कि सदस्य को परिभाषित करता है द्वारा पहुँचा जा सकता है।

चूंकि आपका परीक्षण फ़ंक्शन बेस क्लास बार में चलता है, तो यह निजी कार्य को अपनी कक्षा में एक्सेस करेगा।

5

private सदस्यों, ओवरराइड नहीं किया जा सकता है केवल सार्वजनिक और संरक्षित वाले कर सकते हैं। इसका मतलब है कि, वास्तव में, testPrivateनहीं अधिरोहित, तो Bar है इसे नहीं देख सकते हैं और अभी भी अपने स्वयं के testPrivate कहता है।

5

निजी तरीकों कुछ भी लेकिन घोषित वर्ग को दिखाई नहीं देते। चूंकि आप पेरेंट क्लास से testPrivate पर कॉल करते हैं, इसलिए इसकी एकमात्र विधि जिस तक पहुंच है, वह विधि की अपनी घोषणा है। इस प्रकार आप जो आउटपुट देखते हैं उसे प्राप्त करते हैं। यदि एक्सेस संशोधक protected था, तो, आपको आउटपुट प्राप्त होगा, क्योंकि संरक्षित विधियां पूरे विरासत श्रृंखला में दिखाई दे रही हैं।

5

क्योंकि private मतलब है private। कोई अन्य वर्ग नहीं, यहां तक ​​कि बाल-वर्ग भी Bar::testPrivate() के बारे में नहीं जानते हैं और इसलिए कुछ ऐसी चीजों को ओवरराइड नहीं कर सकते हैं जिन्हें वे नहीं जानते हैं।

आप केवल Foo अंदर Foo::testPrivate() उपयोग कर सकते हैं। क्योंकि private यह सब कुछ है।

अधिक जानकारी: Strange behavior when overriding private methods

3

इस विशिष्ट पीएचपी नहीं है।विरासत नियम संरक्षित और सार्वजनिक कार्यों के लिए अतिसंवेदनशील होने के लिए कहते हैं। निजी कार्यों का अपना दायरा होता है और सामान्यीकृत वर्ग के लिए अदृश्य होते हैं।

कृपया जावा, एक ही परिणाम में एक ही स्थिति नीचे खोजने के लिए:

Bar::testPrivate 

Foo::testPublic 

आप को छोड़कर एक चेतावनी

The method testPrivate() from the type Foo is never used locally Foo.java  

मिल सकता है के बाद से जावा संकलित किया गया है।

public class Bar 
{ 
    public void test() { 
     this.testPrivate(); 
     this.testPublic(); 
    } 

    public void testPublic() { 
     System.out.println("Bar::testPublic\n)"); 
    } 

    private void testPrivate() { 
     System.out.println("Bar::testPrivate\n"); 
    } 
} 

public class Foo extends Bar { 
    public void testPublic() { 
     System.out.println("Foo::testPublic\n"); 
    } 

    private void testPrivate() { 
     System.out.println("Foo::testPrivate\n"); 
    } 

    public static void main(String[] args) { 
     Foo myFoo = new Foo(); 
     myFoo.test(); 
    } 
}