人们习惯于按有组织的层次关系思考问题。因此,毫不奇怪,继承这个概念广泛应用于日常生活的很多方面。
很多系统都相当依赖于层次概念,公司管理结构、美国税务系统和我们对动植物世界的研究体系只是其中的几个例子。
因为面向对象程序设计的前提是:对于要用代码实现的真实世界环境,能够用更接近人的方式对这个环境的性质和行为进行建模,所以还能够表示层次关系就非常有意义。
例如,假设应用程序将类命名为Employee,用来表示从员工中提取的特征和行为。
表示这些特征的类成员包括以下几项。
- name:员工姓名。
- age :员工年龄。
- salary :员工工资。
- yearsEmployed :员工在公司里的工作年数。
Employee 类的方法包括以下几项:
- dowork:完成一些与工作相关的任务。
- eatLunck :午餐休息。
- takeVacation :度过两个星期的假期。
这些特征和行为可能与所有类型的员工都有关,而且,无论员工在公司里的作用或职位是什么。但是很明显,员工之间也有差别;例如,主管可以拥有股票,能够侵占公司,而其他员工就没有这样的奢望。助理必须能记录备忘录,办公室管理人员需要建立供应名单。由于存在这些差别,倘若必须为所有类共有的属性创建和维护冗余的类结构,效率就太低了。
OOP开发范型考虑了这一点,允许继承现有的类,根据现有的类创建新类。
在 PHP 中,类继承通过extends关键字实现。代码清单中展示了这一点,在此首先创建一个Employee类,然后创建一个继承自Employee的Executive类。
PS:继承自其它类的类称为子类,子类所继承的类称为父类或基类。
<?php
// Define a base Employee class
class Employee {
private $name;
// Define a setter for the private $name member.
function setName($name) {
if ($name == "") echo "Name cannot be blank!";
else $this->name = $name;
}
// Define a getter for the private $name member
function getName() {
return "My name is ".$this->name."<br />";
}
} //end Employee class
// Define an Executive class that inherits Employee
class Executive extends Employee {
// Define a method unique to Employee
function pillageCompany() {
echo "I'm selling company assets to finance my yacht!";
}
} //end Executive class
// Create a new Executive object
$exec = new Executive();
// Call the setName() method, defined in the Employee class
$exec->setName("Richard");
// Call the getName() method
echo $exec->getName();
// Call the pillageCompany() method
$exec->pillageCompany();
?>
执行的结果:
My name is Richard
I'm selling company assets to finance my yacht!
因为所有员工都有姓名,所以Executive类继承了Employee类,避免了必须重新创建name成员及相应获取方法和设置方法的麻烦。然后可以专心实现主管所特有的性质,在这里就是一个名为pillageCompany()的方法。此方法只在Executive类型的对象中可用,在Employee类或其他类中都不能使用(除非是继承自Executive的类)。下面的示例演示了这个概念,这里给出了一个继承自Executive的CEO类:
<?php
class Employee{
...
}
class Executive enxtends Employee{
...
}
class CEO extends Executive{
function getFacelift(){
echo "nip nip tuck tuck";
}
}
$ceo= new CEO();
$ceo->setName("Bernie");
$ceo->pillageCompany();
$ceo->getFacelift();
?>
因为CEO继承自Executive,所以CEO类型的对象也具有Executive可用的所有成员和方法。
除了getFacelift()方法,Executive也为CEO类型的对象所唯一保留。
下面补个简单的例子:
<?php
class Fruit {
private $name ;
function __construct($name) {
$this->name = $name;
}
function showName() {
echo $this->name."<br />";
}
}
class Apple extends Fruit {
private $color;
function __construct() {
parent::__construct("苹果");
$this->color = "红色";
}
function showColor() {
echo $this->color;
}
}
$apple = new Apple();
$apple->showName();
$apple->showColor();
?>
猜你喜欢: