2010-08-20 16 views
6

तो, यह आखिरी घबराहट विरासत प्रश्न है जो मैंने थोड़ी देर के लिए किया था इसलिए मैं आगे बढ़ना चाहता था और पूछना चाहता था। तो मैं PHP में एक उदाहरण देता हूँ:हुड के तहत विरासत

<?php 

class Base 
{ 
    private $z = 4; 


    function GetPrivate() 
    { 
     echo $this->z; 
    } 

} 

class Derived extends Base 
{ 
} 

$b = new Base(); 
$d = new Derived(); 

$d->GetPrivate(); 

>

सरल पर्याप्त। जब मैंने हमेशा विरासत के बारे में पढ़ा है, तो स्पष्टीकरण बस "आप जनता और संरक्षित सदस्यों का उत्तराधिकारी" थे और यही वह है। जो कुछ मुझे नहीं मिलता है, इस बारे में कुछ चीजें हैं कि इस उदाहरण में दुभाषिया किस प्रकार से संबंधित है।

उदाहरण के लिए, जब व्युत्पन्न कक्षा बनाते हैं, तो मैं बेस के सार्वजनिक फ़ंक्शन "गेटप्रिवेट" का उपयोग करने में सक्षम हूं, बेस क्लास के निजी चर प्राप्त करता है। हालांकि, विरासत की सरल परिभाषा मेरे साथ काम नहीं करती है। मेरा मतलब यह है कि, मैं GetPrivate विधि का उत्तराधिकारी हूं लेकिन अभी भी उस विधि से निजी चर के लिए कुछ प्रकार का लिंक है जो बेस क्लास से संबंधित है (भले ही यह $ व्युत्पन्न क्लास ऑब्जेक्ट को संदर्भित करता हो)। मैं उन निजी चरों तक पहुंचने के लिए व्युत्पन्न कक्षा में एक नया फ़ंक्शन नहीं बना सका।

इस प्रकार, क्या दुभाषिया बेस क्लास से विरासत वाले कार्यों और उस बेस क्लास के लिए उपलब्ध निजी सदस्यों के संभावित लिंक पर टैब रखता है?

उत्तर

2

दुभाषिया (या अन्य ओओपी भाषा में कंपाइलर), एक समय में एक चरण तक पहुंच की जांच करें।

जब आप $d->GetPrivate(); फोन, दुभाषिया संदर्भ (सार्वजनिक संदर्भ के रूप में मुझे लगता है कि आप एक संबंधित कक्षा में Drerived या Base के लिए नहीं कर रहे हैं) की जांच में यह मुख्य है और GetPrivate() एक सार्वजनिक विधि है। इस प्रकार, इस संदर्भ में $d->GetPrivate(); की अनुमति है इसलिए कोई त्रुटि नहीं।

GetPrivate() में, संदर्भ Base रूप $d वस्तु है और z के लिए उपयोग वर्तमान वस्तु ($d) के एक निजी तत्व है। इस प्रकार पहुंच वैध है।

यहां खेलने के लिए आने वाली अवधारणा 'डेटा हैडिंग' (एक्सेस कंट्रोल) और 'एनकैप्यूलेशन' (डेटा और फ़ंक्शन का संयोजन) है।

की विरासत ही करने की अनुमति देता है कि यह Derived की एक वस्तु के हैं के रूप में Base की GetPrivate() प्रयोग की जाने वाली खेलने के लिए।

यह सच है कि अभी भी एक निजी डेटा का लिंक है लेकिन यह लिंक प्रत्यक्ष नहीं है। महत्व यह है कि पहुंच Base वर्ग की अनुमति के रूप में होती है।

तो आपके प्रश्न का उत्तर है:

हाँ! दुभाषिया क्या आधार वर्ग से विरासत में मिली कार्य करता है और संभव लिंक वे केवल कि आधार वर्ग के लिए उपलब्ध निजी सदस्यों को पकड़ थे पर नजर रखने के लिए।

उम्मीद है कि इससे मदद मिलती है।

2

जवाब है एक सरल हाँ, यह बाहर की कोशिश:

<?php 


class Base 
{ 
    private $z = 10; 

    public function getPrivate() 
    { 
     return $this->z; 
    } 
} 


class Derived extends Base 
{ 
    public function getPrivate() 
    { 
     return $this->z; 
    } 
} 

$a = new Derived(); 

echo $a->getPrivate(); 

आपको लगता है कि अब है कि हम getPrivate परिभाषित किया है Derived वर्ग हम कर सकते हैं के पास अब z पर Base में अपनी निजी के बाद से देखेंगे, अगर हम व्युत्पन्न वर्ग से इसे एक्सेस करने में सक्षम होना चाहते हैं, जिसे हमें निजी की बजाय संरक्षित करने की घोषणा करने की आवश्यकता है।

1

ठीक है, मैं पार्सर विवरण के बारे में ज्यादा नहीं बता सकते हैं, लेकिन समझ के लिए महत्वपूर्ण समझ visibility का मतलब है:

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

Now, the PHP manual also states:

उदाहरण के लिए, जब आप एक वर्ग का विस्तार, उपवर्ग माता पिता वर्ग से सार्वजनिक और संरक्षित तरीकों के सभी इनहेरिट करती है। जब तक कोई वर्ग उन विधियों को ओवरराइड नहीं करता है, तब तक वे अपनी मूल कार्यक्षमता बनाए रखेंगे।

आप व्युत्पन्न वर्ग पर एक var_dump($d) करते हैं, तो आप उसमें शामिल देखेंगे Base->z:

object(Derived)#2 (1) { 
    ["z":"Base":private]=> 
    int(4) 
} 

तो वहाँ बेस में जेड के लिए एक संदर्भ है, लेकिन यह निजी और निजी साधन सदस्य के बाद से है केवल उस वर्ग द्वारा एक्सेस किया जा सकता है जो सदस्य को परिभाषित करता है, आप इसे व्युत्पन्न से एक्सेस नहीं कर सकते हैं।

बेस में एक सार्वजनिक तरीकों की पेशकश के द्वारा निजी सदस्य को पाने के लिए, आप प्रभावी रूप से माता पिता विधि के माध्यम से पहुंच को नियंत्रित कर रहे हैं। हो सकता है कि $z ऐसा कुछ है जिसे केवल विस्तारित कक्षाओं में पढ़ा जाना है, उदाहरण के लिए डेटाबेस एडाप्टर।

यह जानकारी छुपा और अभिगम नियंत्रण है। इसका मतलब यह नहीं है कि, यदि आप बेस का विस्तार करते हैं, तो आप $ z खो देंगे। विरासत एक है-एक रिश्ता है। व्युत्पन्न is-a आधार है और इस तरह, इसके पास $ z है, हालांकि स्वयं पर नहीं बल्कि इसके माता-पिता के माध्यम से।

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

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