找回密码
 立即注册
搜索
查看: 2294|回复: 4

[面向对象] 【OOP代码示例】抽象类与接口

 火... [复制链接]

581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

发表于 2016-1-27 18:12:54 | 显示全部楼层 |阅读模式
抽象方法和抽象类
  1. <?php
  2. //含有抽象方法的类一定是抽象类
  3. //抽象类不一定含有抽象方法
  4. //抽象类中可以有普通的方法
  5. //抽象类不能直接实例化,必须由一个子类去继承它。并把所有父类中的抽象方法都实现(重写)
  6. abstract class person{

  7.     //定义抽象方法:修饰词:abstract 方法是没有方法体的   
  8.     public abstract function say($name);
  9.     public abstract function run();
  10.      
  11.     public function eat(){
  12.         echo "eat...";
  13.     }
  14. }

  15. class student extends person{

  16.     public function say($name){
  17.         echo "{$name} say...";
  18.     }

  19.     public function run(){
  20.         echo "run";
  21.     }

  22.   
  23. }

  24. $student = new student();
  25. $student -> say("lisi");
  26. echo "<hr />";
  27. $student -> eat();
复制代码

接口技术
  1. <?php
  2. //接口 声明关键字 interface
  3. //接口中可以声明常量也可以声明抽象方法
  4. //接口中的方法都是抽象方法不需要使用abstract修饰
  5. //接口不能实例化,需要用一个类去实现它(implements)
  6. //一个类可以实现多个接口(解决了PHP单继承的问题)
  7. interface person{
  8.     const NAME = "lisi";

  9.     public function say();
  10.     public function run();
  11.     public function eat();
  12. }

  13. interface learn{

  14.     public function study();
  15. }

  16. class student implements person,learn{

  17.     public function say(){
  18.         echo "say...";
  19.     }

  20.     public function run(){
  21.         echo "run...";
  22.     }

  23.     public function eat(){
  24.         echo "eat...";
  25.     }

  26.     public function study(){
  27.         echo "study...";
  28.     }
  29. }

  30. $student = new student();
  31. $student -> say();
  32. echo "<hr />";
  33. echo student::NAME;
  34. echo "<hr />";
  35. $student -> study();
复制代码

多态应用
1.computer.class.php
  1. <?php
  2. include("./mouse.class.php");
  3. include("./store.class.php");
  4. include("./key.class.php");

  5. class computer{

  6.     public function useUSB($obj){
  7.         $obj -> run();
  8.     }
  9. }

  10. $computer = new computer();

  11. $computer -> useUSB(new mouse());
  12. echo "<hr />";
  13. $computer -> useUSB(new store());
  14. echo "<hr />";
  15. $computer -> useUSB(new key());
复制代码
2.mouse.class.php
  1. <?php
  2. include_once("./usb.interface.php");
  3. class mouse implements USB{

  4.     public function run(){
  5.         $this -> init();
  6.     }

  7.     public function init(){
  8.         echo "mouse running ...";
  9.     }
  10. }
复制代码
3.store.class.php
  1. <?php
  2. include_once("./usb.interface.php");
  3. class store implements USB{
  4.    
  5.     public function run(){
  6.         $this -> initialize();
  7.     }

  8.     private function initialize(){
  9.         echo "store running ..";
  10.     }
  11. }
复制代码
4.usb.interface.php
  1. <?php
  2. interface USB{

  3.     public function run();
  4. }
复制代码
5.key.class.php
  1. <?php
  2. include_once("./usb.interface.php");
  3. class key implements USB{
  4.    
  5.     public function run(){
  6.         $this -> init();
  7.     }

  8.     public function init(){
  9.         echo "key running ..";
  10.     }
  11. }
复制代码


581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

 楼主| 发表于 2022-10-28 18:00:15 | 显示全部楼层
【声名】什么是抽象方法?
定义:如果一个类中的方法,没有方法体的方法就是抽象方法。
如果一个方法是抽象方法,就必须使用 abstract 去修饰
  1. public abstract function say($name);
  2. public abstract function run();
复制代码

【作用】为什么要使用抽象方法?想要使用抽象类,就必须使用一个类去继承抽象类,而且想要使用这个子类,也就是让子类可以创建对象,子类就必须不能再是抽象类,子类可以重写父类的方法(给抽象方法加上方法体);

抽象方法中的方法没有方法体,子类必须实现这个方法(父类中没写具体的实现,但子类必须有这个方法名)

就是再定义一些规范,让子类按这些规范去实现自己的功能;
目的:就是要将你自己写好的程序模块 加入 到原来已经写好的程序中去(别人写好的程序,不能等你开发完一个小模块,根据你的小模块继续向后开发)

581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

 楼主| 发表于 2022-10-28 18:05:55 | 显示全部楼层
什么是抽象类?
1:如果一个类中,有一个方法是抽象的则这个类就是抽象类;
2:如果一个类是抽象类,则这个类必须要使用abstract修饰;
3:抽象类是一种特殊的类,就是因为一个类中有抽象方法,也可以再抽象类中声名成员属性,常量,非抽象的方法。
4:抽象类不能实例化对象(不能通过抽象类去创建一个抽象的对象)

问题:
一、抽象方法没有方法体,不知道是做什么的(没写功能)
二、对象中的方法和属性都要通过对象来访问,除常量和静态方法的变量和方法,而抽象类有不能创建对象,抽象类中的成员都不能直接访问;

581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

 楼主| 发表于 2022-10-29 12:05:55 | 显示全部楼层
接口技术

接口中一种特殊的抽象类, 抽象类又是一种特殊的类
接口和抽象类是一样的作用
因为在PHP是单继承的, 如果使用抽象类,子类实现完抽象类就不能再去继承其它的类了。
如果即想实现一些规范, 又想继承一个其他类。就要使用接口
接口和抽象类的对比
1. 作用相同,都不能创建对象, 都需要子类去实现
2. 接口的声明和抽象类不一样
3. 接口被实现的方式不一样
4. 接口中的所有方法必须是抽象方法,只能声明抽象方法(不用使用abstract修饰)
5. 接口中的成员属性,只能声明常量,不能声明变量
6. 接口中的成员访问权限 都必须是public, 抽象类中最低的权限protected
7. 使用一个类去实现接口, 不是使用extends关键字, 而是使用implements这个词

如果子类是重写父接口中抽象方法,则使用implements, 类--接口, 抽象类---接口 implements 接口---接口 extends
可以使用抽象类去实现接口中的部分方法
如果想让子类可以创建对象,则必须实现接口中的全部抽象方法
可以定义一个接口去继承另一个接口
一个类可以去实现多个接口(按多个规范去开发子类), 使用逗号分隔多个接口名称
一个类可以在继承一类的同时,去实现一个或多个接口(先继承,再实现)
使用implements的两个目的
1. 可以实现多个接口 ,而extends词只能继承一个父类
2. 没有使用extends词,可以去继承一个类, 所以两个可以同时使用

581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

 楼主| 发表于 2022-10-29 12:06:30 | 显示全部楼层
“多态”是面向对象设计的重要特性,它展现了动态绑
定(dynamic binding)的功能,也称为“同名异
式”(Polymorphism)。多态的功能可让软件在开发和维护
时,达到充分的延伸性(extension)。事实上,多态最直接
的定义就是让具有继承关系的不同类对象,可以对相同名称
的成员函数调用,产生不同的反应效果。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|十三博客 ( 鲁ICP备2023000528号 )

GMT+8, 2026-6-1 14:57 , Processed in 0.056471 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表