php接口类与抽象类的实际作用,抽象类与接口的区别
今天我看到一个关于程序员的基本能力要知道:抽象、多态、接口、异常处理的能力。
于是就看了一下抽象与接口
接口:
接口中只能声明抽象方法(包括静态抽象方法)和静态变量:
1. 定义抽象方法时不能加 abstract 关键字,因为默认隐式就是抽象的.
2. 不能加 final 关键字来防止接口中方法的继承.
3. 接口中的方法默认是 public 的,不能用 protected 和 private 修饰符修饰.
4. 接口内定义的方法成员不能在接口中实现.
接口中一般不考虑属性,只考虑方法,使得子类可以自由的填补和扩充接口中说定义的方法,也就是说接口偏重于行为.
一个子类要实现一个接口,如果该子类是非抽象类就必须实现接口中所有定义的方法(不管是否需要);如果该子类是一个抽象类,则可以实现接口中的方法,也可以不实现.接口也有一个显而易见的缺点就是,如果接口中的方法名改变了,那么所有实现此接口的子类将无法通过编译,因为他们说实现的方法名已经不存在了.
接口还有一个优点就是能够同时实现多个接口.
接口可以这样理解:它并不仅仅是一个类,而更是一个规范.
每一个应用程序作为一个系统,不断有旧的成员被新的成员取代,但系统仍然可以正常运行,为什么?就是因为所有的成员都遵守一个让系统正常运行的规范,在这样一个系统中接口就扮演着这样一个角色,它没有代替成员做具体的工作,而是告诉成员如何去做(接口中的方法).这就是接口最主要的作用,通过接口耦合的系统有更好的整体性,可维护性和可扩展性.正因为有这样的作用,使得接口一旦发布,就不能更改,而只能通过定义新的接口来增加功能,
抽象类:
抽象类不但包含了一般类的特点,即包括属性和方法外,还可以声明抽象方法(包括静态抽象方法).
1. 抽象方法前必须加上 abstract 关键字,表示声明为抽象方法.
2. 可以加 final 关键字来防止抽象类中的普通方法被继承.
3. 抽象类中的方法可以用 public , protected 和 private 修饰符修饰,具有普通类方法的效果.
抽象类一般作为公共的父类为子类的扩展提供基础(这里的扩展包括了属性上的和行为上的),而如果继承一个抽象类,只需要实现其中的抽象方法,这是抽象类的一个优点.
抽象类如果修改了自身的某一个抽象方法,子类同样也编译不过,因为此时子类没有实现新的抽象方法,但若修改的是抽象类中的非抽象方法,则并不影响子类的编译,就相当于子类多了一个方法.也就是说可以抽象类中可以任意增加和修改非抽象类而不会影响子类的编译.
抽象类还有一个缺点,就是一个子类只能有一个父类,即如果 A extends B ,A就拥有了B中的所有方法,但是如果A还想拥有C中的方法,就不能通过 A extends C 的方式来实现.
总结:
在许多情况下,如果你不用刻意表达属性上的继承的话,接口和抽象类是可以相互替代的.
接口和抽象类的作用从本质上是一样的,就是规定一些共同的方法.只要某个类是继承自某个抽象类或者实现了多个接口,则其必须完全实现接口和抽象类中的所有抽象方法.之所以两者可以共存,是因为只支持单一类继承,但可以实现多个接口以实现类似多重继承的功能.
实例:
1.php 接口类:interface
其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候php接口类就起到作用了,当我们定义了一个接口类时,它里面的方式是下面的子类必须实现的,比如 :
[php]
interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}
[/php]
我声明一个shop接口类,定义了三个方法:买(buy),卖(sell),看(view),那么继承此类的所有子类都必须实现这3个方法少一个都不行,如果子类没有实现这些话,就无法运行。实际上接口类说白了,就是一个类的模板,一个类的规定,如果你属于这类,你就必须遵循我的规定,少一个都不行,但是具体你怎么去做,我不管,那是你的事,如:
[php]
class BaseShop implements Shop
{
public function buy($gid)
{
echo('你购买了ID为 :'.$gid.'的商品');
}
public function sell($gid)
{
echo('你卖了ID为 :'.$gid.'的商品');
}
public function view($gid)
{
echo('你查看了ID为 :'.$gid.'的商品');
}
}
[/php]
你想想,在一个多人合作的大项目里面,有了接口类是多么的方便,这样你就不用去问别人,你的某某功能的方法名是什么了,当然如果你们喜欢这样我也没有办法。
结论 : 接口类就是一个类的领导者,指明方向,子类必须完成它指定方法。
2.php 抽象类 : abstract
其实抽象类和接口类有一部分很像,记得在哪里看见这样一句话,抽象类就把类像的部分抽出来,这句看上去很搞笑,其实它说出了抽象类的真理,抽象类的作用是,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这个公共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,让你就像直接调用本类方法一样方便,而且你还可以重载这个方法。如:
[php]
abstract class BaseShop
{
public function buy($gid)
{
echo('你购买了ID为 :'.$gid.'的商品');
}
public function sell($gid)
{
echo('你卖了ID为 :'.$gid.'的商品');
}
public function view($gid)
{
echo('你查看了ID为 :'.$gid.'的商品');
}
}
class BallShop extends BaseShop
{
var $itme_id = null;
public function __construct()
{
$this->itme_id = 2314;
}
public function open()
{
$this->sell($this->itme_id);
}
}
[/php]
这里是一个例子,想上面一样我定义了一个商店类,抽出了它所有像的部分,买(buy),卖(sell),看(view),并且抽象类里都实现了这些方法,那么继承它的子类就自动获得了这些方法,子类就做它自己独特的东西,介绍代码的重复,提高复用性。
结论: 抽象类就是一个类的服务提供商,拥有众多服务,你不用必须用,当需要的时候你来用就可以,如果你觉得不提供服务不满意,你还可以自己来做。