PHP面向对象之旅:接口与组合模拟多继承

在一个类中去将另外一个类设置成属性
服务器君一共花费了626.333 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

通过组合模拟多重继承

在PHP中不支持多重继承,如果我们向使用多个类的方法而实现代码重用有什么办法么?那就是组合。在一个类中去将另外一个类设置成属性。

下面的例子,模拟了多重继承。

<?
class User {
	private $name = "tom";
	public function getName(){
		return $this->name;
	}
}
class Teacher{
	private $lengthOfService = 5; // 工龄	
	public function getLengthOfService(){
		return $this->lengthOfService;
	}
}
// 上面的类中的set方法就不写了.
// 如果有个研究生,既是学生也算工龄. 
class GraduateStudent extends User {
	private $teacher ;
	public function __construct(){
		$this->teacher = new Teacher();		
	}	
	public function getLengthOfService(){
		return $this->teacher->getLengthOfService();
	}
}
$graduateStudent = new GraduateStudent();
echo "name is ".$graduateStudent->getName()."<br>";
echo "lengthOfService is ".$graduateStudent->getLengthOfService();
?>

程序运行结果:

name is tom
lengthOfService is 5

不完全的多重继承

上面的例子是多重继承么?

我们继续运行下面的代码。

<?
class User{
	private $name = "tom";
	public function getName(){
		return $this->name;
	}
}
class Teacher{
	private $lengthOfService = 5; // 工龄	
	public function getLengthOfService(){
		return $this->lengthOfService;
	}
}
class GraduateStudent extends User {
	private $teacher ;
	public function __construct(){
		$this->teacher = new Teacher();		
	}	
	public function getLengthOfService(){
		return $this->teacher->getLengthOfService();
	}
}
class Act{
	public static function getUserName(User $_user){
		echo $_user->getName();
	}
	public static function  getLengthOfService(Teacher $_teacher){
		echo $_teacher->getLengthOfService();
	}
}
$graduateStudent = new GraduateStudent();
Act::getUserName($graduateStudent);
Act::getLengthOfService($graduateStudent);
?>

程序运行结果:

tom
Catchable fatal error: Argument 1 passed to Act::getLengthOfService() must be an instance of Teacher, instance of GraduateStudent given, called in E:\PHPProjects\NowaMagic\php\4-8-2.php on line 34 and defined in E:\PHPProjects\NowaMagic\php\4-8-2.php on line 28

我们并不能将$graduateStudent代表的实例当作Teacher类型传入。

这样的多重继承是失败的,没有多重身份,怎么能叫多重继承呢?

使用接口实现多重继承

通过把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份,自然就可以完全模拟多重继承了。

<?
interface UserInterface{ //定义User的接口
	function getname();
}
interface TeacherInterface{ //teacher相关接口
	function getLengthOfService();
}
class User implements UserInterface { //实现UserInterface接口
	private $name = "tom";
	public function getName(){
		return $this->name;
	}
}
class Teacher implements TeacherInterface { //实现TeacherInterface接口
	private $lengthOfService = 5; // 工龄	
	public function getLengthOfService(){
		return $this->lengthOfService;
	}
}
// 继承自User类,同时实现了TeacherInterface接口.
class GraduateStudent extends User implements TeacherInterface {
	private $teacher ;
	public function __construct(){
		$this->teacher = new Teacher();		
	}	
	public function getLengthOfService(){
		return $this->teacher->getLengthOfService();
	}
}
class Act{
	//注意这里的类型提示改成了接口类型
	public static function getUserName(UserInterface $_user){
		echo "Name is " . $_user->getName() ."<br>";
	}
	//这里的类型提示改成了TeacherInterface类型.
	public static function  getLengthOfService(TeacherInterface $_teacher){
		echo "Age is " .$_teacher->getLengthOfService() ."<br>";
	}
}
$graduateStudent = new GraduateStudent();
Act::getUserName($graduateStudent);
Act::getLengthOfService($graduateStudent);
//结果正如我们所要的,实现了有多重身份的一个对象.
?>

程序运行结果:

Name is tom
Age is 5

延伸阅读

此文章所在专题列表如下:

  1. PHP面向对象之旅:类和对象
  2. PHP面向对象之旅:类的属性
  3. PHP面向对象之旅:类的方法
  4. PHP面向对象之旅:对象的比较
  5. PHP面向对象之旅:构造函数
  6. PHP面向对象之旅:类的继承
  7. PHP面向对象之旅:访问控制
  8. PHP面向对象之旅:方法覆盖
  9. PHP面向对象之旅:this关键字
  10. PHP面向对象之旅:parent::关键字
  11. PHP面向对象之旅:再谈重载
  12. PHP面向对象之旅:获取用户数据
  13. PHP面向对象之旅:用户权限管理类
  14. PHP面向对象之旅:static变量与方法
  15. PHP面向对象之旅:单例模式
  16. PHP面向对象之旅:final类和方法
  17. PHP面向对象之旅:PHP中的常量
  18. PHP面向对象之旅:抽象类
  19. PHP面向对象之旅:抽象方法
  20. PHP面向对象之旅:抽象类继承抽象类
  21. PHP面向对象之旅:静态抽象方法
  22. PHP面向对象之旅:模板模式
  23. PHP面向对象之旅:接口与抽象方法
  24. PHP面向对象之旅:接口的实现
  25. PHP面向对象之旅:接口的继承
  26. PHP面向对象之旅:类型提示
  27. PHP面向对象之旅:PHP的多态
  28. PHP面向对象之旅:instanceof运算符
  29. PHP面向对象之旅:接口与组合模拟多继承
  30. PHP面向对象之旅:一个接口实例
  31. PHP面向对象之旅:简单工厂模式

本文地址:http://www.nowamagic.net/librarys/veda/detail/1110,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1110

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《算法导论(原书第2版)》 科曼(Cormen T.H.) (作者), 等 (作者, 译者), 潘金贵 (译者)

《算法导论(原书第2版)》一书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。

更多计算机宝库...