abstract类和abstract方法

来源:互联网 发布:parallelsdesktop mac 编辑:程序博客网 时间:2024/05/01 13:40

可以使用abstract来修饰一个类或者方法。

用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。

抽象类不能被实例化。

抽象方法是只有方法声明,而没有方法的实现内容。

abstract 抽象类

可以使用abstract来修饰一个类。

用abstract修饰的类表示这个类是一个抽象类。

抽象类不能被实例化。

这是一个简单抽象的方法,如果它被直接实例化,系统会报错。

[php] view plaincopyprint?
  1. <?php  
  2. //定义一个抽象类  
  3. abstract class User  
  4.  
  5.     public function __toString()  
  6.         return get_class($this);  
  7.       
  8.  
  9. //实例化这个类会出现错误  
  10. echo new User();  
  11. ?>  

下面例子的 NormalUser 继承自 User类,就可以被实例化了。

[php] view plaincopyprint?
  1. <?php  
  2. //定义一个抽象类  
  3. abstract class User  
  4.  
  5.     public function __toString()  
  6.         return get_class($this);  
  7.       
  8.  
  9. //实例化这个类会出现错误  
  10. echo new User();  
  11. class NormalUser extends User  
  12.  
  13.  
  14. $a new NormalUser();  
  15. echo "这个类" $a "的实例" 
  16. ?>  

单独设置一个抽象类是没有意义的,只有有了抽象方法,抽象类才有了血肉。下面介绍抽象方法。

abstract 抽象方法

用abstract修饰的类表示这个方法是一个抽象方法。

抽象方法,只有方法的声明部分,没有方法体。

抽象方法没有 {} ,而采用 ; 结束。

一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。

抽象方法在子类中必须被重写。

下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回 $sal 员工的工资。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected $sal 0;  
  5.     //这里定义的抽象方法。  
  6.     //注意抽象方法没有方法体,而且方法结束使用 号。  
  7.     abstract function getSal();  
  8.     abstract function setSal();  
  9.     //定义它的__tostring方法  
  10.     public function __toString()  
  11.         return get_class($this);  
  12.       
  13.   
  14. ?>  

既然User类不能被直接继承,我们写一个NormalUser类继承自User类。当我们写成如下代码时,系统会报错。这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected $sal 0;  
  5.     //这里定义的抽象方法。  
  6.     //注意抽象方法没有方法体,而且方法结束使用 号。  
  7.     abstract function getSal();  
  8.     abstract function setSal();  
  9.     //定义它的__tostring方法  
  10.     public function __toString()  
  11.         return get_class($this);  
  12.       
  13.  
  14. class NormalUser extends User  
  15.  
  16.  
  17. ?>   

下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected $sal 0;  
  5.     //这里定义的抽象方法。  
  6.     //注意抽象方法没有方法体,而且方法结束使用;号。  
  7.     abstract function getSal();  
  8.     abstract function setSal();  
  9.     //定义它的__tostring方法  
  10.     public function __toString()  
  11.         return get_class($this);  
  12.       
  13.  
  14. class NormalUser extends User  
  15.  
  16.     function getSal()  
  17.      
  18.     function setSal($sal  
  19.      
  20.  
  21.     //这样就不会出错了。  
  22. ?>  

下面19-21行,三种写重写的方式都会报错。

19行,缺少参数。

20行,参数又多了。

21行,参数类型不对。(这种写法在以后章节介绍)

一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。

下面这个类不是抽象类,其中定义了一个抽象方法,会报错。

[php] view plaincopyprint?
  1. <?php  
  2. class User  
  3.  
  4.     protected $sal 0;  
  5.     //这里定义的抽象方法。  
  6.     //注意抽象方法没有方法体,而且方法结束使用;号。  
  7.     abstract function getSal();  
  8.     abstract function setSal();  
  9.     //定义它的__tostring方  
  10.     public function __toString()  
  11.         return get_class($this);  
  12.       
  13.  
  14.     //这个类中有两个抽象方法,如果这个类不是抽象的。会报错  
  15. ?>  

抽象类继承抽象类

抽象类继承另外一个抽象类时,不用重写其中的抽象方法。

抽象类中,不能重写抽象父类的抽象方法。

这样的用法,可以理解为对抽象类的扩展

下面的例子,演示了一个抽象类继承自另外一个抽象类时,不需要重写其中的抽象方法。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected $sal 0;  
  5.     abstract function getSal();  
  6.     abstract function setSal($sal);   
  7.  
  8. abstract class VipUser extends User  
  9.  
  10.  
  11. ?>  

抽象类在被继承后,其中的抽象方法不能被重写。

如果发生重写,系统会报错。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected $sal 0;  
  5.     abstract function getSal();  
  6.     abstract function setSal($sal);   
  7.  
  8. abstract class VipUser extends User  
  9.  
  10.     abstract function setSal();   
  11.  
  12. ?>  

抽象类继承抽象类,目的对抽象类的扩展。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected $sal 0;  
  5.     abstract function getSal();  
  6.     abstract function setSal($sal);   
  7.  
  8. abstract class VipUser extends User  
  9.  
  10.     protected $commision 0;  
  11.     abstract function getCommision();  
  12.     abstract function setCommision();  
  13.  
  14. ?>  

在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。

静态抽象方法

在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。

[php] view plaincopyprint?
  1. <?php  
  2. abstract class User  
  3.  
  4.     protected static  $sal 0;  
  5.     static abstract function getSal();  
  6.     static abstract function setSal($sal);   
  7.  
  8. class VipUser extends User  
  9.  
  10.     static function getSal()  
  11.         return self::$sal 
  12.      
  13.     static function setSal($sal 
  14.         self::$sal $sal 
  15.      
  16.  
  17. VipUser::setSal(100);  
  18. echo "you sal is " VipUser::getSal();  
  19. ?>  
  20. //这里的抽象方法好像没有问题  
0 0