浅谈PHP面向对象编程(七)

7.0 抽象类与接口


当定义一个类时,常常需要定义一些方法来描述该类的行为特征、但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口。

抽象类和接口用于提高程序的灵活性、抽象类是一种特殊的类,而接口又是一种待殊的抽象类。

接下来本节将针对抽象类和接口进行详细讲解。

7.1 抽象类


当在定义一个类的 时候,其中所霜的某些方法暂时并不能完全定义出来,而是让其继承的类来实现,此时就可以用到抽象类。

比如定又一个动物类,每种动物有一“叫” 的方法,面每种动物叫的方式不同,因此可以将动物类定义为一个抽象类。

定义抽象类需要使用 abstract 关键字来修饰,语法格式具体如下:

1 abstract class  类名{
2       
3    //类成员
4   
5 }

由于每种动物叫的方式不同,所以需要将动物同的shut方法定义成抽象的, 即只有方法声明面设有方法体的方法,在子类继承时再来编写该方法的具体实规,这种特珠的方法称为抽象方法,其语法格式如下

1 abstract function 方法名 ();

为了更好的理解抽象类和抽象方法的使用,接下来t通过个案例来演示

例7-19

 1 <?php
 2      //使用abstract关键字声明一个抽象类 
 3      abstract class Animal{    
 4         //在抽象类中声明抽象方法
 5         abstract public function shout(); 
 6      }
 7      //定义Dog类继承自Animal类
 8      class Dog extends Animal{
 9         //实现抽象方法shout()
10          public function shout()
11         {
12              echo "汪汪......<br>";
13          }
14      }
15     //定义Cat类继承自Animal类
16     class Cat extends Animal{
17          //实现抽象方法shout()
18           public function shout()
19          {
20              echo "喵喵......<br>";
21          }
22      }
23      $dog=new Dog();
24      $dog->shout();
25      $cat=new Cat();
26     $cat->shout();
27  ?>

运行结果

例7-19中,第3-6行代码定义了一个抽象类Animal. 然后使Dog类和Cat类继承Animal类并实现抽象方法shout(). 最后分别调用cat对象和dog对象的shout()方法,输出不同动物对应的叫声

注意:

(1)抽象类不能被实例化。

(2)抽象类可以没有抽象方法,但有抽象方法的抽象关才有意义,一旦类包含了抽象方法,则这个类必须声明为abstract。

(3)抽象关中可以有非抽象方法、成员属性和常量。

(4)抽象方法不能有函数体,它只能存在于抽象类中。

(5)如果一个类继承了某个抽象类,则它必须实现该抽象类的所有抽象方法、除非它自己也声明为抽象类。

7.2 接口


如果一个抽象类中的所有方法都是抽象的、则可以将这个类用另外一种方式来定义。即接口。在定义接口时,需要使用interface关键字,具体示例代码如下:

1 interface Animal{
2 
3    public function run ();
4 
5    public function breathe();  
6 
7 }

定义接口与定义一个标准的类类似,但其中定义的所有的方法都是空的。

需要注意的是接口中的所有方法都是公有的,也不能使用 final关键字来修饰

由于接口中定义的都是抽象方法,没有具体实现,需要通过类来实现接口。实现接口使用 implements 关键字。

接下来通过一个案例来学习,如例7-20 所示

 1 <?php
 2      //定义Animal接口
 3      interface  Animal{
 4          public function run();
 5          public function shout();
 6      }
 7      //定义Dog类,实现了Animal接口
 8      class Dog implements Animal{
 9           public function run(){
10               echo "狗在奔跑<br>";
11          }
12          public function shout(){
13              echo "汪汪……<br>";
14          }
15      }
16      //定义Cat类,实现了Animal接口
17     class Cat implements Animal{
18          public function run(){
19              echo "猫在奔跑<br>";
20         }
21         public function shout(){
22             echo "喵喵……<br>";
23         }
24      }
25     $cat=new Cat();
26     $cat->run();
27     $cat->shout();
28     $dog=new Dog();
29     $dog->run();
30     $dog->shout();
31 ?>

 运行结果

在例7-20中,首先定义了接口Animal,在接口Animal中声明了抽象方法run()和shout().
然后分别通过Cat类和Dog类实现了Animal接口最后通过cat和dog对象调用run()和shout()方法。
在PHP中类是单继承的,但一个类却可以实现多个接口,并且这些接口之间用逗号分展开,接下来通过一个具体的案例来学习,
如例7-21所示。 

例7-21

 1  <?php
 2      //定义Animal接口
 3      interface  Animal{
 4          public function run();
 5          public function shout();
 6      }
 7      //定义LandAnimal接口
 8      interface  LandAnimal{
 9          public function LiveOnLand();     
10      }
11     //定义Dog类,实现了Animal和LandAnimal接口
12     class Dog implements Animal,LandAnimal{
13          public function LiveOnLand(){
14             echo"狗在陆地上生活<br>";
15         }
16          public function run(){
17               echo "狗在奔跑<br>";
18          }
19          public function shout(){
20             echo "汪汪……<br>";
21         }
22     }
23     $dog=new  Dog();
24     $dog->LiveOnLand();
25     $dog->run();
26     $dog->shout();
27 ?>

运行结果

在例7-21中,动物类Dog同时实现了接口Animal和LandAnimal,

通过dog对象调用了LandAnimal中的LiveOnLand()方法

和Animal接口中的run()和shout()方法

扩展-继承和接口的配合使用


在使用implements关键宇实现接口的同 时,还可以使用extends 关键字继承一个类。

即在继承一个类的同时实现接口,但一定要先使用extends继承一个类,再使用implements实现接口,

具体示例如下所示:

1 class 类名 extends 父类名 implements 接口1,接口2,....接口n{
2 
3      //实现所有接口中的抽象方法
4 
5 }

PHP的单继承机制可保证类的纯洁性,比C++中的多继承机制简洁。

但是不可否认,对子类功能的扩展有一定影响。

所以我们认为实现接口可以看作是对继承的一种补充。

实现接口可在不打破继承关系的前提下,对某个类功能扩展,非常灵活。

猜你喜欢

转载自www.cnblogs.com/lemon-Net-Skill/p/9811510.html
今日推荐