子类是不是继承父类的私有成员? [复制]

Posted

技术标签:

【中文标题】子类是不是继承父类的私有成员? [复制]【英文标题】:Is subclass inherits private members from parent class? [duplicate]子类是否继承父类的私有成员? [复制] 【发布时间】:2018-06-14 01:40:11 【问题描述】:

我有两个关于 OOP 继承对象的问题:

    第一个是根据下面的代码:

    class Test 
    
    private $name = "Youhana";
    
        function getPrivate()
            echo   $this->name ;
        
    
    
    
    Class Test2 extends Test 
    
    
    $obj2 = new Test2();
    $obj2->getPrivate();
    

结果将是 => Youhana,但是这是如何工作的,尽管继承意味着成员是从父级克隆到子级的,所以如果这是正确的,那么子类中的代码必须类似于以下逻辑:

 Class Test2 // simple imagination to the Test2 after extends Test CLass
      function getPrivate() //which must return null not the value of the private member.
        echo   $this->name ;
      

参考:Manual

    第二个问题是考虑下面的代码:

     Class Ex1
    
        function checkClassName()
            var_dump(__CLASS__); 
        
    
    
    Class Ex2 extends Ex1
    
    
    
    
    $obj2 = new Ex2();
    
    $obj2->checkClassName();//how this will return EX1 although we invoked this function from the second object which after the inheritance will have a clone of public and protected members of the parent class?
    

虽然我们从第二个对象调用了这个函数,但它如何返回 EX1,在继承之后将有父类的公共和受保护成员的克隆?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

当您从超类扩展时,不会“克隆”任何内容。这是错误的看待这个问题的方式。该类基本上是用于创建实例的模板。

超类中的private 属性仅对该超类中定义的方法可见。这就是为什么它被称为“可见性”。

当您创建子类时,private 属性仍然存在。它们只是在子类中定义的方法中不可见。

class Foo 
    private $x = 1;        
    public function check() 
        return $this->x;
    


class Bar extends Foo 
    public $x = 2;


class Buz extends Foo 
    private $x = 3;
    public function check() 
        return $this->x;
    


$n = new Bar;
var_dump($n); /*
 object(Bar)#1 (2) 
   ["x"]=>
   int(2)
   ["x":"Foo":private]=>
   int(1)
  */
var_dump($n->check()); // int(1)

$k = new Buz;
var_dump($k->check()); // int(3)

https://3v4l.org/KkTD2

当你扩展一个类时,你正在创建一个专门的 subtype case,它应该仍然是 compatible 与原始超类. privateextend 一起使用时,其意义在于定义不受任何行为变化影响的部分。

至于__CLASS__,它是一个“神奇的常数”(暗示这实际上不是常数),由访问它的上下文决定。它会给你类的名字,然后在里面写__CLASS__

不过,我不知道你想用它做什么,因为你不应该在生产代码中使用它。

【讨论】:

所以你的意思是继承意味着只调用和访问父类,这是否正确?你完美的例子证明了这一点。 当你有一个对象时,你实际上并不是在“调用一个类”。相反,您正在与基于“模板”制作的实例进行交互。 extend 关键字应该用于添加更专业的行为(参见:LSP)。另外,你的英语很烂:( @tereško 您能否为magic constants __CLASS__ 的范围解析添加解释,以解决OP 的第二个问题? 继承不是子类型。子类型是指接口的兼容性。继承是指实现的重用。谷歌“继承与子类型化”、“子类化与子类型化”,更多信息请参阅 William Cook 和 Alistair Cockburn 的论文。 @reaanb thnx。稍微清理了一下。它只是一种表达方式,而不是技术术语。而且,不,上一句中的“表达”也没有用作技术术语。【参考方案2】:

我想解释一下克隆的概念。

假设,我们有 classA 具有 3 个属性:

 - private int x
 - protected int y
 - public int z

然后我们有一个继承自ClassAClassB

在这种情况下,我们将克隆用作结构克隆。意味着父类的所有属性和方法都克隆到子类中。我们可以通过获取子类实例的大小来证明这一点。

但是,他们是访问策略。这是 OOP 中的封装。

ClassB 具有 x,y,z 属性。但它无法访问x。 (因为封装)

结构克隆概念在运行时很重要。在运行时,孩子和父母之间没有任何关系。克隆到子级的父级的所有结构。在子类中,我们可以使用super(在java中)和base(在C#中)等关键字来访问这个克隆的部分。

最后,正如我所说,在子类中,我们有父类的私有成员。我们可以使用按语言提供的关键字访问它们。但是,由于封装原则,我们无法访问私有数据。

【讨论】:

没有。 php 中的克隆是一个特定的事情:secure.php.net/manual/en/language.oop5.cloning.php 免责声明:我不懂 PHP,我的专业是 Java。但是,请考虑我所说的结构克隆是指在编译过程中复制类的结构。 不是编程中的对象克隆。

以上是关于子类是不是继承父类的私有成员? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

继承的基本概念: Java不支持多继承,也就是说子类至多只能有一个父类。 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类中定义的成员变量和父类中

java中,子类能调用父类中所有方法、对象吗?是不是父类也能调用子类所有……?

java中字段继承问题--子类不能继承父类的私有成员

JAVA中子类能不能继承父类的私有属性和方法?

子类能不能继承父类的成员变量

子类能继承父类的哪些变量和方法