引擎盖下的传承

Ily*_*lya 6 php inheritance

所以,这是我最后一次唠叨继承问题,所以我想继续问一下.所以我将在PHP中给出一个例子:

<?php

class Base
{
    private $z = 4;


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

}

class Derived extends Base
{
}

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

$d->GetPrivate();
Run Code Online (Sandbox Code Playgroud)

?>

很简单.当我一直读到关于继承的时候,解释只是"你继承了公众和受保护的成员",就是这样.我没有得到的是关于这个例子中的解释器如何计算什么属于什么的一些事情.

例如,当创建派生类时,我能够使用Base的公共函数"GetPrivate"获取基类的私有变量.但是,继承的简单定义对我来说不起作用.我的意思是,我继承了GetPrivate方法,但我仍然只是从属于基类的那个方法得到某种私有变量的链接(即使$ this指的是派生类对象).我无法在Derived类中创建新函数来访问这些私有变量.

因此,解释器是否会密切关注基类中继承的函数以及它们对仅适用于该基类的私有成员的可能链接?

Naw*_*Man 3

解释器(或其他 OOP 语言中的编译器)一次一步地检查访问。

当您调用 时$d->GetPrivate();,解释器会检查 this is main 中的上下文(公共上下文,因为我假设您不在 或 的相关类中DrerivedBase并且GetPrivate()是一个公共方法。因此,$d->GetPrivate();在这种情况下是允许的,因此不会出现错误。

在 中GetPrivate(),上下文是$dobject asBase并且访问z是当前对象 ( $d) 的私有元素。因此访问是有效的。

这里发挥作用的概念是“数据隐藏”(访问控制)和“封装”(数据和功能的组合)。

继承 to play 仅允许GetPrivate()使用 ,Base因为它属于 的对象Derived

确实,仍然存在指向私有数据的链接,但该链接不是直接链接。重要的是访问发生在Base类允许的情况下。

所以回答你的问题是:

是的!解释器密切关注从基类继承的函数以及它们与仅对该基类可用的私有成员的可能链接。

希望这可以帮助。