面向对象 OOP中的抽象类,接口以及多态
Posted 李佳阳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象 OOP中的抽象类,接口以及多态相关的知识,希望对你有一定的参考价值。
[抽象类与抽象方法]
1、什么是抽象方法?
没有方法体{}的方法,必须使用abstract关键字修饰,这样的方法,我们称之为抽象方法。
abstract function say()
2、什么是抽象类?
包含抽象方法的类就是抽象类,抽象类必须使用abstract关键字修饰
abstract class Person{}
3、抽象类的注意事项
①抽象类可以包含非抽象方法
②包含抽象方法的类,一定是抽象类
抽象类 并不一定包含抽象方法
③抽象类,不能实例化
(抽象类中可能包含抽象方法,抽象方法没有方法体,实例化调用没有意义)
我们使用抽象类的目的就是限制实例化
4、子类继承抽象类,那么子类必须重写父类的所有抽象方法,除非,子类也是抽象类
5、使用抽象类的作用?
① 限制实例化。(抽象类是一个不完整的类,里面的抽象方法没有方法体,所以不能实例化)
② 抽象类为子类的继承提供一种规范,子类继承一个抽象类,则必须包含并且实现抽象类中已定的抽象方法
abstract class Person{ abstract function say(); function say1(){} } abstract class Chinese extends Person{ }
[接口]
1、什么是接口?
接口是一种规范,提供了一组实现接口的类所必须实现的方法组合
接口的使用interface关键字声明
interface Inter{}
2、接口中的所有方法必须都是抽象方法
接口中的抽象方法不需要也不能使用abstract修饰
3、接口中不能声明变量,不能有属性,只能使用常量
4、接口可以继承接口,使用extends关键字
接口使用extends继承接口,也不能实现多继承
interface Int1 extends Inter{}
5、类可以实现接口,使用implements关键字
类使用implements实现接口,可同时实现多个接口,多个接口用逗号分隔
abstract class Person implements Inter,Inter2{}
一个类实现一个或多个接口,那么这个类型必须实现所有接口中的所有抽象方法,除非,这个类是抽象类
[接口与抽象类的区别]
1、声明方式上,接口用interface关键字,抽象类使用abstract class
2、实现\继承方式上,一个类使用extends继承抽象类,使用implements实现接口
3、抽象类只能单继承,接口可以多实现(接口extends接口),多实现(类implements接口)
4、抽象类中可以有非抽象方法,接口中只能有抽象方法,不能有非抽象方法
抽象类中的抽象方法必须使用abstract关键字修饰,接口中抽象方法不能带修饰词
5、抽象类是个类,可以有属性,变量。接口中只能有常量。
interface Inter{ const NUM = 10; function say(); } interface Int1 extends Inter{}; abstract class Person implements Inter{ }
模拟打印机案例:
墨盒:彩色、黑白
纸张类型:A4、B5
墨盒和纸张都不是打印机厂商提供的
打印机的打印功能需要使用兼容市场上的墨盒、纸张
测试
interface Mohe{ function color(); } interface Paper{ function sizes(); } class Printer { function prints(Mohe $m,Paper $p){ echo "即将开始打印...<br>"; $m->color(); $p->sizes(); echo "开始打印...<br>"; echo "打印完毕!!!<br>"; } } class black implements Mohe{ function color(){ echo "正在装载墨盒...<br>"; echo "装载黑色墨盒成功...<br>"; } } class colors implements Mohe{ function color(){ echo "正在装载墨盒...<br>"; echo "装载彩色墨盒成功...<br>"; } } class A4 implements Paper{ function sizes(){ echo "正在加载纸张...<br>"; echo "加载A4纸张成功...<br>"; } } class B5 implements Paper{ function sizes(){ echo "正在加载纸张...<br>"; echo "加载B5纸张成功...<br>"; } } $parint = new Printer(); $parint->prints(new colors(), new A4());
[多态]
1、一个类被多个子类继承
如果,这个类的某个方法,再多个子类中,表现出不同的功能,我们称这种行为为多态
2、实现多态的必要途径
①子类继承父类;
②子类重写父类方法;
③父类引用指向子类对象;
abstract class Persom{ abstract function say(); } class Chinese extends Persom{ function say(){ echo "我是中国人,我说中国话"; } } class English extends Persom{ function say(){ echo "I‘m an English,I speak English"; } } /*$c = new Chinese(); $c ->say(); $e = new English(); $e ->say(); */ function func(Person $p){ $p ->say(); } func(new Chinese()); func(new English());
以上是关于面向对象 OOP中的抽象类,接口以及多态的主要内容,如果未能解决你的问题,请参考以下文章