【问题标题】:Class inheritance - Calling properties and/or methods not in the parent class类继承 - 调用不在父类中的属性和/或方法
【发布时间】:2013-07-23 17:57:38
【问题描述】:

我正在尝试理解类继承。

假设我有以下代码(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()。这个概念有什么特别的术语/行话吗? (或者它只是“类继承”定义的一部分)

【问题讨论】:

    标签: php class oop inheritance


    【解决方案1】:

    我正在尝试找出深度继承将进行多少级。

    如果你愿意的话。没有限制

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

    对于类变量: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
    

    【讨论】:

    • 关于第二个问题,我的意思是说,“我从 $cObject 调用 fire(),但 fire() 没有在 C 类中定义。这个概念叫什么?有没有用于此的行话/术语“
    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多