1

我试图理解类继承。

假设我有以下代码(PHP):

class A {
     public function fire() {
        echo "Fire!";
     } 
}

class B extends A {
     public function water() {
        echo "Water!";
     }
}

class C extends B {
     public function lightning() {
         echo "Lightning!";
     }
}

$cObject = new C();

$cObject->fire();  

我的问题是

  • 即使在 C 类和 B 类中都没有定义 fire() 方法,$cObject->fire() 仍然有效。C 类是否不仅继承了 B 类的方法,还继承了 A 类的方法?我试图找出深度继承将进行多少级。
  • 是否有调用当前对象实例中不存在的属性或方法,但该属性或方法存在于父类或祖先类中的术语?编辑:换句话说,C 类中没有定义 fire(),但 $cObject 仍然可以调用 fire()。这个概念有什么特别的术语/行话吗?(或者它只是“类继承”定义的一部分)
4

2 回答 2

2

我试图找出深度继承将进行多少级。

无限地,如果你愿意的话。无限

是否有调用当前对象实例中不存在的属性或方法,但该属性或方法存在于父类或祖先类中的术语?

对于类变量:no. 对于类方法:yes. 将它们声明为private

class A {
    private function test() {
        echo 'test';
    }
}

class B extends A {
    public function __construct() {
        $this->test();
    }
}

$b = new B();

输出:

Fatal error: Call to private method A::test() from context 'B' in /home/thorsten/a.php on line 14
于 2013-07-23T17:59:30.020 回答
1

1)“B”类是“A”类。“C”类是“B”类,因此,“C”类是“A”类。“B”在“A”、“C”中拥有的所有权利和特权。C++ 有一个私有继承的概念,在这里有点奇怪,但这是一般的想法。正如在另一个答案中所说,只要定义了链,继承就会继续。

2)我想你的意思是问“什么是未定义在派生类中,而是在基类中定义的函数。 这种类型的函数称为虚函数。据我了解,PHP中的每个类函数都是一个虚函数并且可以被覆盖(在派生类中重新实现),除非它被声明为final

于 2013-07-23T18:45:59.107 回答