抽象类和抽象方法和接口

有些知识,是为了解决某个场景中的难题而生。 了解那个"令人尴尬"的场景,为了解知识点更重要。
假设如下场景: 团队准备开发某王站,表建好了,页面设计好了。
A组负责开发底层数据库类(DB),上传类。 B级负责调用DB类
A组发生了争执,MySQL? Oracle? DB2? sqlite?
B组.... 漫长等待.
当确定用mysql的时候,B组已经等了一个月了。
能否让B组不等待?
解决: A组和B组先定1个数据库类的模板: 模板中对:方法名,参数,返回值,都做严格的规定 此时,不
管A组选用什么数据库,对于B组来说,没有任何影响;

 1 abstract class aDB{
 2  /**
 3  * 参数:sql语句
 4  * 返回类型:array
 5  **/
 6  abstract public function getAll($sql);
 7  abstract public function getRow($sql);
 8 }
 9 
10 class Mysql extends aDB{
11  public function getAll($sql){
12  
13  }
14  public function getRow($sql){
15  
16  }
17 }

在编程中,有个概念叫"面向接口编程"。
开发和调用者之间,不直接通信,大家都对"共同的标准"负责。
比如:B组调用以aDb为准,A组最终的开发,也依aDb为准。
生活中的例子:

抽象类和方法的特征:
1、类前要加abstract,则为抽象类。
2、方法前也可以加abstract,则为抽象方法。
3、抽象方法没有方法体
4、抽象类中也可以有已经实现的方法。但,只有要1个方法为抽象,则类仍是抽象的。
5、抽象类不能实例化
6、抽象类必须被继承,实现所有的抽象方法才能使用。

 1 <?php
 2  //多个对象协同⼯作
 3  //饲养员与不同动物表演
 4  
 5  //饲养员
 6  class Person{
 7  public $name;
 8  public function __construct($name){
 9  $this->name = $name;
10  }
11  public function work($obj){
12  echo $this->name.'正在工作<br/>';
13  //1.喂养动物
14 
15  $obj->eat();
16  //2.表演
17  $obj->show();
18  }
19  }
20  //父类里面的方法只是用于保证子类里面有这个方法
21  abstract class Animal{
22  public function eat(){
23  echo '正在吃东西...<br/>';
24  }
25  
26  //抽象方法(半成品)
27  abstract public function show();
28  }
29  //二狗
30  class Dog extends Animal{
31  public function eat(){
32  echo '狗吃吃吃。。。。<br/>';
33  }
34  public function show(){
35  echo '玩球球。。。。<br/>';
36  }
37  }
38  //小猫
39  class Cat extends Animal{
40  public function eat(){
41  echo '吃大雨...<br/>';
42  }
43  public function show(){
44  echo '补充耗。。。<br/>';
45  }
46  }
47  //猴子
48  class Monkey extends Animal {
49  public function eat(){
50  echo '吃香蕉。。。<br/>';
51  }
52  public function play(){
53  echo '玩个蕉...<br/>';
54  }
55  public function show(){
56  echo '玩个头...<br/>';
57  }
58  }
59 
60  //实例化对象
61  $lq = new Person('老王');
62  $wc = new Dog;
63  $tom = new Cat;
64  $wk = new Monkey;
65  //饲养员在公作
66  //$lq->work($wc);
67  //$lq->work($tom);
68  $lq->work($wk);

总结:

 1 <?php
 2  abstract class A{
 3  abstract public function eat();
 4  abstract public function say();
 5  }
 6  //抽象类必须继承 而且还要完成里面的所有抽象方法
 7  abstract class B extends A{
 8  //抽象方法必须被重写
 9  public function say(){
10  }
11  public function eat(){
12  }
13  //继承的时候还可以追加抽象方法
14  abstract public function he();
15  }
16  //重写了所有抽象方法的类才算是一个完整的类 才能被实例化
17  class C extends B{
18  public function he(){
19  }
20  }
21  $a = new C;
22  var_dump($a);

接口

抽象类可以理解为"类的模板",接口则是"方法"的模板。 即,接⼝的粒度更小,用于描述通用的方
法。

/*
比如一个社交网站, 
关于用户的处理是核心应用. 
登陆 
退出 
写信 
看信 
招呼 
更换⼼情 
吃饭 
骂人
捣乱 
示爱 
撩骚 
这么多的方法,都是用户的方法, 
自然可以写一个user类,全包装起来 
但是,分析用户一次性使不了这么方法 
用户信息类:{登陆,写信,看信,招呼,更换心情,退出} 
用户娱乐类:{登陆,骂人,捣乱,示爱,撩骚,退出} 
开发网站前,分析出来这么多方法, 
但是,不能都装在一个类里, 
分成了2个类,甚至更多. 
作用应用逻辑的开发,这么多的类,这么多的方法,都晕了. 
*/ 
interface UserBase { 
 public function login($u,$p); 
 public function logout(); 
} 
interface UserMsg { 
 public function wirteMsg($to,$title,$content); 
 public function readMsg($from,$title); 
} 
interface UserFun { 
 public function spit($to); 
 public function showLove($to); 
} 
/* 
作为调用者, 我不需要了解你的用户信息类,用户娱乐类, 
我就可以知道如何调用这两个类 
因为: 这两个类 都要实现 上述接口. 
通过这个接口,就可以规范开发. 
*/ 
/* 
下面这个类,和接口声明的参数不一样,就报错, 
这样,接口强制统一了类的功能 
不管你有几个类,一个类中有几个方法 
我只知道,方法都是实现的接口的方法.
*/ class User implements UserBase { public function login($u) { } } interface USB{ //在接口里面所有的方法都是抽象方法 所以不需要额外的修饰 public function run(); } interface typeC{ public function xxx(); } //接口与接口之间是继承关系 interface PS2 extends USB{ public function move(); } class A{} //类与接口之间是实现关系 //实现接口可以多实现 中间使用逗号隔开 //类在继承其他类的同时可以实现接口(多时间) 继承一定要在实现前面 class Mouse extends A implements PS2,typeC{ public function run(){} public function move(){} public function xxx(){} }

接口特征:
1、在接口里面所有的方法都是抽象方法 不需要额外修饰
2、接口里面不能写成员属性里面只能有常量和抽象方法
3、接口与接口之间是继承关系
4、类与接口之间是实现关系
5、实现接口可以多实现 中间使⽤逗号隔开
6、类在继承其他类的同时可以实现接口(多实现),继承一定要在实现前面

抽象类与接口的区别

抽象类:主要用于双方协作的规范,属于大方向模版。
接口:组成事务具体零件的规范,属于具体开发模版。
如何选择?
如果你仅仅是用于指定这个模块要不要开发,是现在开发还是以后开发,起一个指引作用,要使用接
口。
如果你在制定大规范,并且涉及各部门之间的配合,要使用抽象类

猜你喜欢

转载自www.cnblogs.com/zhony/p/10268672.html