抽象类 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中的抽象类是一种特殊的类,它可以包含抽象方法和普通方法。抽象方法是没有实现的方法,只有声明,没有实现。抽象类不能被实例化,只能被继承。继承抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。抽象类可以有构造函数,但是不能是public或者protected,只能是private或者protected。抽象类可以有静态方法,也可以有非静态方法。抽象类可以有成员变量,也可以有静态成员变量。抽象类可以被继承,也可以被实现接口。
|
6月前
|
C++
C++程序中的抽象类
C++程序中的抽象类
70 0
|
Java 编译器
认识抽象类
认识抽象类
83 0
|
Java
Java面向对象 抽象类与抽象方法的使用(关键字abstract)
Java面向对象 抽象类与抽象方法的使用(关键字abstract)
79 0
|
Java
Java面向对象(19)--抽象类与抽象方法abstract
Java面向对象(19)--抽象类与抽象方法abstract
107 0
|
设计模式 C#
C#(十九)之抽象类abstract
本篇内容记录了C#中的抽象类的一些特点。
251 0
C#(十九)之抽象类abstract
|
Java 程序员
每天一个知识点(六)抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
1949 0