(42)抽象类和抽象方法的应用(43)接口与面向对象中多态的应用

 (42)抽象类和抽象方法的应用
抽象类 接口 多态

  抽象类是一种特殊的类, 接口是一种特殊的抽象类, 而多态就要使用到抽象类或是接口

 声明抽象类和接口,以及一些需要的技术
 
   抽象类
 
 什么是抽象方法?
 
  定义:如果一个类中的方法,没有方法体的方法就是抽象方法(就是一个方法没有使用


{}而直接使用分号结束)
     
      abstract function test();  //抽象方法

function test(){  //有方法体,但方法体为空的

}


如果一个方法是抽象方法,就必须使用abstract修饰
 
为什么要使用抽象方法?
     
       什么是抽象类?
 
     abstract class Demo {
abstract function test();  //真正的抽象类
      }
  1. 如果一个类中,有一个方法是抽象的则这个类就是抽象类
  2. 如果一个类是抽象类,则这个类必须要使用abstract修饰
  3. 抽象类是一种特殊的类,就是因为一个类中有抽象方法,其他不变。也可以


在抽象类中声明成员属性,常量,非抽象的方法。
  4. 抽象类不能实例化对象(不能通过抽象类去创建一个抽象类的对象)
 
 我们面临的两个疑问:
 一、抽象方法没有方法体,不知道做什么的(相当于没写功能)
 二、对象中的方法和属性都要通过对象来访问,除常量和静态的变量和方法, 而抽象类


又不能创建对象,抽象类中的成员都不能直接访问
 
接口
 
 作用:
    要想使用抽象类,就必须使用一个类去继承抽象类,而且要想使用这个子类,也


就是让子类可以创建对象,子类就必须不能再是抽象类, 子类可以重写父类的方法(给


抽象方法加上方法体相当于覆盖)
 
 抽象方法中的方法没有方法体, 子类必须实现这个方法 (父类中没写具体的实现, 但


子类必须有这个方法名)
 
 
 就是在定义一些规范,让子类按这些规范去实现自己的功能
 
 目的: 就是要将你自己写的程序模块 加入 到原来已经写好的程序中去 (别人写好的


程序,不能等你开发完一个小模块,根据你的小模块继续向后开如)
 
  多态
 

一、abstract class Demo {
var $name;
var $age;

abstract function test();
abstract function fun();


function say(){
echo "#############33";
}


function run(){

}
}


class Hello extends Demo {       //继承以上的抽象类
function test() {       //覆盖以上抽象方法的子类
echo "子类要完成的任务1";
}
function fun(){
echo "了类中另一个实现";
}
}


$h=new Hello;


$h->test();










二、abstract class FileDir {
var $filename;
var $time;


function getName(){    //这两个方法是公用的
echo "获取文件和目录的名子<br>";
}


function getTime(){     //公用的方法
echo "获取文件和目录的创建时间<br>";
}


abstract function getSize();
abstract function copy();
abstract function remove();
abstract function delete();


}


             //文件的类
class FileClass extends FileDir {     //继承以上的抽象类
function getSize(){          //以下几个子类来覆盖上面的抽象


子类
echo "获取文件的大小<br>";
}


function copy(){
echo "复制文件<br>";
}


function remove(){
echo "移动文件<br>";
}


function delete(){
echo "删除文件<br>";
}
}




             //目录的类
class DirClass extends FileDir {
function getSize(){
echo "获取目录的大小<br>";
}


function copy(){
echo "复制目录<br>";
}


function remove(){
echo "移动目录<br>";
}


function delete(){
echo "删除目录<br>";
}
}



$fd= new DirClass;   //调用目录(我们还可以$fd= new FileClass;调用


文件。就这样我们可以调用第三方的类)



$fd->getName();
$fd->getSize();
$fd->copy();
$fd->remove();
$fd->delete();

$fd->getTime();





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


 如果子类是重写父接口中抽象方法,则使用implements, 类--接口, 抽象类---接口 implements 接口---接口 extends
 
   可以使用抽象类去实现接口中的部分方法
   如果想让子类可以创建对象,则必须实现接口中的全部抽象方法
  
  可以定义一个接品口去继承另一个接品口


   一个类可以去实现多个接口(按多个规范去开发子类), 使用逗号分隔多个接口名称


   一个类可以在继承一类的同时,去实现一个或多个接口(先继承,再实现)


   使用implements的两个目的
    1. 可以实现多个接口 ,而extends词只能继承一个父类
    2. 没有使用extends词,可以去继承一个类, 所以两个可以同时使用
 
     class 类名{
 
     }
 
     abstract class 类名 {
 
     }
 
    声明方式
 
    interface 接口名{    //接口只能用这个声明
 
    }
  
 
 


  interface Demo {
 const HOST="localhost";   //定义常量,接口处不可以定义变量
 const USER="Admin";


           function  fun1();  //不可以设置私有或者保护状态
           function  fun2();  //接口处只可以定义以上一种与这种的两种方法


 /*          function  fun3(){    //不可以的,方法不能有体
}
*/
  }


            echo Demo::HOST;




interface Demo2 extends Demo {    //类继承接口不可以用extends而是用implements(实现)但是接口继承接口用extends就可以了
  function fun3();


function fun4();   
  }


  interface Demo3 {
  function fun5();  
function fun6();   
  }
  interface Demo4{
  function fun7();
  }
class hello{
      function fun8(){
         
            }
   }
   class test  extend  hello implements Demo2,Demo3,Demo4{  //一个类可以在继承一类的同时,去实现一个或多个接口(先继承,再实现)


         function  fun1(){   //一个类可以去实现多个接口(按多个规范去开发子类), 使用逗号分隔多个接口名称
}
         function  fun2(){
}
         function  fun3(){

         function  fun4(){
}
         function  fun5(){
}
         function  fun6(){
}
          function  fun7(){
}
         function  fun8(){
}




}




 多态:  多态是面向对象的三大特性之一
 
“多态”是面向对象设计的重要特性,它展现了动态绑定(dynamic binding)的功能,也称为“同名异式”(Polymorphism)。多态的功能可让软件在开发和维护时,达到充分的延伸性(extension)。事实上,多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同的反应效果。


 interface Test {
    function aaa();
function bbb();
   }




  class One implements Test{
  function aaa(){
echo "AAAAAAAAAAAAAAAAA<br>";
}


function bbb(){
echo "BBBBBBBBBBBBBBBBBB<br>";
}
  }


  class Two implements Test {
  function aaa(){
echo "11111111111111111111<br>";
}


function bbb(){
echo "222222222222222222222222<br>";
}
  }
   
   $a=new one;  //输出AAAAAAA/BBBBBBB如果将one改成two那么就是输出来111111/2222实现了对相同名称的成员函数调用,产生不同的反应效果。那么怎么统一调用多个方法呢?就需要统一调用相同的接口或者相同的规范。还有多个类必须有相同的对象方法。


   $a->aaa();
   $a->bbb();










用开发电脑的统一USB接口作为例子
interface  USB {
function mount();  //挂载
function work();
function unmount();   //卸载
}




class Upan implements USB {    //实现USB
function mount(){
echo "U 盘挂载成功, 可以使用<br>";
}


function work(){
echo "U 盘开始工作<br>";
}


function unmount(){
echo "U 盘卸载成功<br>";
}
}


class FengShan implements USB {
function mount(){
echo "风扇 挂载成功, 可以使用<br>";
}


function work(){
echo "小风扇开始吹小风<br>";
}


function unmount(){
echo "风扇卸载成功<br>";
}
}






class DianNao {
function  useUSB($usb){  //多态的用法
$usb->mount();
$usb->work();
$usb->unmount();
}
}


class Worker {
function install(){    //开始安装


//找到电脑,定义一个电脑的对象
$dn=new DianNao;


//拿过来一些USB设备
$up=new Upan;
$fs=new FengShan;


//向电脑是插入USB设备
$dn->useUSB($fs);
$dn->useUSB($up);//插入两个设备,既可以使用U盘,又可以吹风


}
}




$ren=new Worker;


$ren->install();




查阅单态、工厂的相关资料
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值