面向对象编程中的继承

OOP 中的继承是一个对象可以获取另一个对象的方法和属性的概念。

继承可以帮助开发人员重复使用相关对象的函数。您可能听说过 "不要重复"(DRY)原则;继承可以帮助您减少代码的编写和重复,从而帮助您重复使用代码。

诸如 CavoodleDog 这样的对象是相关的—​我们知道 CavoodleDog 的一种类型。为 DogCavoodle 提供的函数应该侧重于 DogCavoodle 应该能做的事情。例如,如果你有一个 Dog 对象,而它有一个 computeTax 函数,那么这个函数就与 Dog 对象无关,你可能做错了什么—​它的内聚性很低。高内聚意味着你的类专注于做你的类真正应该做的事情。有了高内聚性,就更容易决定一个对象是否应该成为一个可以继承的对象,就像 DogCavoodle 对象一样。如果 Cavoodle 类扩展了 JetEngine 类,那就说不通了,但 Cavoodle 类扩展 Dog 类就完全说得通了:

Cavoodle.php
<?php

namespace Animal\Dogs;
use Animal\Dog;

class Cavoodle extends Dog
{
    public function __construct()
    {
        parent::__construct();
        // Using the protected method from the Dog class.
        $this->setColor("Chocolate");
    }
}

要在使用者类中使用 Cavoodle 类的方法,请创建 Cavoodle 类的新实例:

public function sayHelloCavoodle()
{
    $cavoodle = new Cavoodle();
    $cavoodle->setSound("Bark Bark!");
    // Will output Hello Bark Bark!!, my color is: Chocolate
    $cavoodle->makeSound();
}

Cavoodle 对象使用 extends 关键字继承了 Dog 对象。这意味着 Dog 的任何公共或保护函数现在都可以为 Cavoodle 对象所用。你会发现 Cavoodle.php 类中并没有声明 makeSound 函数,但我们仍然可以使用 $cavoodle→makeSound(); 方法,这是因为 Cavoodle 对象继承了 Dog 对象的 makeSound 函数。