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

相关文章
|
8月前
|
Java
【JAVA学习之路 | 提高篇】抽象类与抽象方法(abstract)
【JAVA学习之路 | 提高篇】抽象类与抽象方法(abstract)
|
Java
Java面向对象 抽象类与抽象方法的使用(关键字abstract)
Java面向对象 抽象类与抽象方法的使用(关键字abstract)
92 0
抽象类和接口(Abstract and Interface)精湛细节
抽象类和接口(Abstract and Interface)精湛细节
abstract
abstract
110 0
|
Java 开发者
抽象类(abstract class)和接口(Interface)的区别
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
|
Java
Java面向对象(19)--抽象类与抽象方法abstract
Java面向对象(19)--抽象类与抽象方法abstract
116 0
|
Scala 开发者
Sealed 类 | 学习笔记
快速学习 Sealed 类
|
前端开发 JavaScript 开发者
class-使用 extends 实现子类继承父类|学习笔记
快速学习 class-使用 extends 实现子类继承父类
122 0
|
Java
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
有一个面试四连击的题目:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
167 0
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
|
设计模式 C#
C#(十九)之抽象类abstract
本篇内容记录了C#中的抽象类的一些特点。
268 0
C#(十九)之抽象类abstract