0

我显然没有正确理解继承。我会让我的代码说话:

abstract class Calc {
private $x;
private $y;
public function AddNumbers() {      
    echo $this->x. " + " .$this->y;
}
}

class myCalc extends Calc {
public function __construct ($x,$y) {
    $this->x = $x;
    $this->y = $y;
   }
}

$calc1 = new myCalc(3,4);
$calc1->AddNumbers();
echo 'done';
exit;

好的,所以这里发生了什么:我想要一个抽象类,它将定义两个属性(x 和 y)和一个抽象方法,(不要介意数字的连接,方法的实现超出了我的问题)将访问那里的属性。

然后,一个具体的类扩展了那个抽象的类。如您所见,我可以成功访问属性并设置它们,但是当我调用添加数字时,似乎属性没有设置。

发生了什么事,为什么这不起作用,我该如何解决?我可以只定义一个在具体类中添加数字的方法,但我想在抽象类中有一个可以重用的定义的方法。

谢谢!

4

2 回答 2

4

抽象类中的两个属性是私有的,这意味着它们在任何扩展该类的类中都不存在和已知。

所以MyCalc不会写入这些属性,并且您无法在AddNumbers函数中读取它们。构造函数实际上创建了新的MyCalc公共属性。

使属性“受保护”,它将起作用。

于 2013-09-12T19:34:35.877 回答
2

private关键字定义只有方法可以修改这些Calc变量。如果您希望其任何子类中的方法Calc 方法访问这些变量,请改用protected关键字。

您可以访问$this->x,因为 PHP 将允许您在对象上创建成员变量而无需声明它。当您这样做时,结果成员变量被隐式声明public,但它与 中private定义的变量无关,该变量Calc不在myCalc.

于 2013-09-12T19:33:50.120 回答