抽象类 Abstract|学习笔记

简介: 快速学习抽象类 Abstract

开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:抽象类 Abstract】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/712/detail/12698


抽象类 Abstract


内容介绍

一、学习目标

二、抽象类概念

三、步骤

四、示例

五、小结


一、学习目标

目标:理解抽象类的概念,掌握 abstract 关键字的作用和实际应用场景,理解大型项目架构的优缺点


二、抽象类概念

抽象类:使用 abstract 关键字修饰的类,表示该类只能被继承,不能被实例化

抽象类只是用来规范下属类的基本结构,本身不可被实例化

抽象类只能被实现类继承 abstract 关键字可以修饰方法,表示方法为抽象方法,抽象方法没有方法体没有{})。

抽象方法存在的类必须为抽象类

继承抽象类的类要么为抽象类,要么实现抽象类里所有的抽象方法

抽象类还可以有其他类该有的任何成员


三、步骤

1项目较大,分组完成

2、项目管理者为了确保各组开发的统一性,规范上层架构

3、使用抽象类和抽象方法设定基调(多种抽象类)规定操作的业务里面都必须用到统一的方法,可以保证其他人在调用抽象类时不用修改代码。一套方法, 只要调用不同的抽象类,就可以解决不同的产品的问题。

4、所有实现类都继承抽象类


四、示例

1、基本语法:使用 abstract 关键字修饰类

# 抽象类

abstracf class Human{}

2、抽象类无法被实例化

# 抽象类

abstract class Human{}

$h=new Human();       # 致命错误,抽象类不能被实例化

比如,代码:

#抽象类 abstract 寸

class Human{}  //这是一个普通类

#实例化

new Human();

//这个代码可以被实例化

代码:

#抽象类 abstract

#抽象类

abstract class Human{}

#不能被实例化

new Human();

//这是一个抽象类,代码不能被实例化

3、抽象类只能被继承(这是抽象类的一个特性)

# 抽象类(父类)

abstract class Human{}

# 子类

class Man extends Human{} # 正确

代码:

#继承抽象类

class Man extends Human{}15

$m = new Man();// 这个子类也是可以实例化

抽象类里面可以定义一些东西

4、abstract 关键字的修饰

abstract 关键字还可以用来修饰方法(抽象方法)abstract 修饰的方法不能有方法体,而且有抽象方法的类必须声明为抽象类

# 抽象方法抽象类

abstract class Human{

# 定义抽象方法:没有方法体

abstract public function eat():

public function show(){}           # 普通方法有方法体

}

说明有大括号就有方法体

代码:

#抽象类 abstract4

#抽象类

abstract class Human{8

#普通方法

public function show(){}

#抽象方法

public abstract function eat();

//有了{}不需要语句结束,但是此处不能有 body {},直接去掉{}则没有结束,所以此处应该再加一个;(分号)

}

#不能被实例化

# new Human();1819

#继承抽象类

class Man extends Human{}

$m=new Man();

此时这个代码依然不能运行,有两个办法,一个是必须把这个类改为抽象类,另一个是实现抽象方法。

图片1.png

(1)将上述代码改为抽象类:

abstract class Man extends Human{}// 此处加上一个 abstract

# $m = npw Man();// Man 一类也是抽象类,不能被实例化。

(2)实现抽象方法,代码:

abstract class Woman extends Man{}

class Man extends Human{

#实现父类抽象方法

public function eat(){}

}

# $m = new Man();

抽象方法对应的类必须为抽象类,而抽象类要么被抽象类继承,要么是实体类继承,但是继承之后要实现抽象方法。

5、抽象方法因为要被子类继承实现,所以不能使用 private 修饰(私有方法不会被继承)

# 抽象类

abstract class Humanf

# 抽象方法

abstract private function eat));   # 错误:抽象方法不能私有化

}

比如代码:

private abstract function eat();

public 变为 private ,显示错误,因为抽象方法不能为 private 。

Protected abstract function eat();

public 变为 Protected 是可以的,因为父子类在实现的过程中本质就是重写这个方法,只是称为实现,本身没有方法比,不存在重写的概念。

图片2.png

若改为 private 显示错误,因为本质是继承了父类的方法,那就存在重写的嫌疑,而重写的嫌疑有一个要求就是子类不能比父类的控制权高,只能让它越开越开放,不能越来越保守。所以用 public 是可以的。

6、子类继承抽象类后,如果抽象类中有抽象方法,那么子类必须选择自己成为抽象类或者实现抽象方法(所有抽象方法)

#抽象方法抽象类(父类)

abstract class Humanf

# 定义抽象方法:没有方法体

abstract public function eat();

public function show(){}         # 普通方法有方法体

}

# 子类1:抽象类继承抽象类

abstract class Man extends Human{}  # 正常继承

# 子类2:子类实现父类所有抽象方法

class Boy extends Man{

# 实现从祖父类维承的 eat 抽象方法

public function eat(){

echo 'eat';

}

}

抽象类的结构就是一种架构,顶层制定好之后,规定了基本的要实现的东西,用这种方式也可以提供具体的操作。做好之后,允许子类继承,如果架构足够庞大,子类可以再进行抽象化,再具体地增加对应的抽象功能。


五、小结

1使用 abstract 修饰的类叫做抽象类

2、抽象类不可以被实例化,只能被继承

3、因为抽象类无法被实例化,因此私有成员在类中没有实质意义(还需要额外提供受保护或者公有方法来实现访问)

4、抽象类的目的是用来规范子类(通常比配抽象方法),让子类继承抽象类,实现抽象类里面的抽象方法。

5、 abstract 还可以修饰方法,称之为抽象方法:抽象方法所在的类必须是抽象类,抽象方法不能有方法体

6、有抽象方法的抽象被继承时子类要么自身是抽象类,要么实现所有抽象方法

7、抽象类是一种结构管理,需要耗费较多的架构和初始代码,通常在比较大型或者规范的项目中才会使用。因为大型项目可能会从上往下逐层地架构规范,底层的代码只要用程序员去实现即可,实现上层架构提供的必须的一些规范,做好了可以方便用于别的团队/用户/开发者调用,但是保证有一套统一的规范。

相关文章
|
算法 Java 调度
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
640 0
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
|
SQL 数据库
初识MDL锁
初识MDL锁
214 1
|
JavaScript
Vue生命周期函数(详解) 1
Vue生命周期函数(详解)
|
存储 弹性计算 运维
对100 以内的所有正整数相加求和
【4月更文挑战第29天】
211 2
|
SQL Oracle 关系型数据库
【postgreSQL】psql工具特有的快捷命令
【postgreSQL】psql工具特有的快捷命令
9112 1
|
IDE Java 编译器
IDEA工具的简单使用
经过本文,你将对IDEA有着基本的认识,以及快速地熟悉IDEA操作!
11721 2
|
机器学习/深度学习 算法
【贪心算法】最大整数
【贪心算法】最大整数
197 0
|
存储 SQL 程序员
【Sql Server】 使用游标循环记录更新字段值
使用游标循环记录更新字段值
443 0
【Sql Server】 使用游标循环记录更新字段值
|
Python
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(中)
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(中)
651 0
python + uiautomator2编译平板语言工具并切换打包exe可执行文件(中)
|
监控 Oracle Java
一份超详细的 Java 问题排查工具单
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让
一份超详细的 Java 问题排查工具单