当前位置: 首页 > article >正文

面对对象抽象类与普通类的区别

目录

抽象类

一、抽象类的定义:

二、用途

抽象类和普通类的对比

一、实例化方面

1.普通类:

2.抽象类

二、方法实现方面

三、设计目的方面

四、继承要求方面


抽象类

一、抽象类的定义:

  • 抽象类是一种不能被实例化的类,它主要用于为其他类提供一个通用的模板或蓝图。抽象类通常包含抽象方法,这些抽象方法是只有方法签名(定义了方法的名称、参数列表和返回类型),但没有具体实现的方法。它强制要求子类必须实现这些抽象方法,从而保证了在继承体系中某些方法的一致性。
  • 例如,在 Python 中,可以使用abc(Abstract Base Classes)模块来定义抽象类。
     from abc import ABC, abstractmethod
     class Shape(ABC):
         @abstractmethod
         def area(self):
             pass

二、用途

  • 代码复用和规范继承结构:抽象类提供了一种复用代码的方式。通过定义抽象类,可以将一些通用的属性和方法放在抽象类中,子类继承这些属性和方法,同时实现自己特有的行为。例如,在一个图形处理程序中,Shape抽象类可以有通用的属性如颜色、位置等,而具体的图形类(如CircleRectangle等)在继承Shape类的同时,实现计算面积(area方法)等具体的操作。
  • 定义接口和契约:抽象类可以定义一组接口(抽象方法),这些接口就像是一种契约,要求子类必须遵守。这样可以确保在一个复杂的系统中,不同的开发人员编写的子类都能够符合预期的行为规范。例如,在一个数据库访问层的抽象类中,定义了抽象方法connectquerydisconnect,所有继承这个抽象类的子类(针对不同的数据库系统,如 MySQL、Oracle 等)都需要实现这些方法,以保证数据库访问的基本操作在接口层面是一致的。

 

抽象类和普通类的对比

一、实例化方面

1.普通类:

普通类可以直接实例化,用于创建对象。例如在python中定义一个普通person

     class Person:
         def __init__(self, name, age):
             self.name = name
             self.age = age
     p = Person("Alice", 25)

这里通过Person类创建了一个名为p的实例,这个实例有自己的属性nameage,并且可以调用Person类中定义的其他方法(如果有的话)。

2.抽象类

抽象类不能直接实例化。抽象类主要作为一个模板和蓝图,为子类提供通用的蓝图和行为规范。例如:使用python的abc模板定义抽象类shape

     from abc import ABC, abstractmethod
     class Shape(ABC):
         @abstractmethod
         def area(self):
             pass

尝试直接实例化shape类(如s=shape())会导致报错,因为它包含抽象方法area,没有完整的实现。

二、方法实现方面

  • 普通类:普通类中的方法通常都有完整的实现。每个方法都定义了具体的操作逻辑,可以直接被调用执行。例如,Person类中的__init__方法用于初始化对象的属性。
  • 抽象类:抽象类可以包含抽象方法,抽象方法只有方法签名(方法名称、参数和返回类型),没有具体的实现。例如,Shape类中的area抽象方法没有具体的计算逻辑,它强制要求子类来实现这个方法。抽象类也可以包含非抽象方法,这些方法有具体的实现,并且子类可以继承和使用这些方法。

三、设计目的方面

  • 普通类:普通类主要用于创建具体的对象,这些对象可以独立地执行特定的功能。它们侧重于实现特定的业务逻辑或数据结构。例如,Person类用于表示人的对象,可能用于存储和处理人的相关信息,如姓名、年龄、职业等。
  • 抽象类:抽象类侧重于提供一个通用的框架或规范。它用于定义一组相关类的公共接口和行为模式。通过抽象类,可以确保子类遵循一定的规则,使得在一个复杂的继承体系中,不同子类的行为在某些方面具有一致性。例如,在图形处理系统中,Shape抽象类规定了所有图形子类(如圆形、矩形等)都需要实现计算面积的方法,从而保证系统能够统一地处理各种图形的面积计算。

四、继承要求方面

  • 普通类:普通类可以被继承,也可以不被继承。当被继承时,子类可以选择重写父类的方法,也可以直接继承使用父类的方法。例如,一个Student类可以继承Person类,并且根据学生的特点重写某些方法或者添加新的方法。
  • 抽象类:抽象类是为了被继承而设计的。子类继承抽象类时,必须实现抽象类中的所有抽象方法(除非子类也是抽象类)。这种要求确保了子类在特定的接口和行为上符合抽象类所设定的规范。例如,CircleRectangle类继承Shape抽象类时,必须实现area方法来计算各自的面积。

http://www.kler.cn/news/362521.html

相关文章:

  • 理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?
  • MySQL中的最左前缀匹配原则
  • #每日一题#自动化 2024年10月
  • 证明竞赛图至少有一个长度不小于2k+1的有向圈
  • AWD的复现
  • 深度解析RLS(Recursive Least Squares)算法
  • 初识js-cnblog
  • 接口测试(六)jmeter——参数化(配置元件 --> 用户定义的变量)
  • 【LeetCode】每日一题 2024_10_18 使二进制数组全部等于 1 的最少操作次数 I(贪心)
  • 6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)
  • 【单元测试】深入解剖单元测试的思维逻辑
  • Nextjs Tailwind CSS 下载和配置
  • 027 elasticsearch查询数据-Java原生客户端
  • 前后端请求一致性学习
  • 解析NIO
  • 如何在 JavaScript 项目中限制Node.js版本
  • 【动手学电机驱动】 TI InstaSPIN-FOC(7)Lab05b 速度环控制
  • RabbitMQ进阶_可靠性
  • 大数据新视界 --大数据大厂之 Snowflake 在大数据云存储和处理中的应用探索
  • 网络安全的挑战与对策:从技术防御到综合治理的全方位分析
  • 阵痛中转型,商汤瘦身背后的AI真相
  • js如何获取一个object的第一条数据
  • Java设计模式——适配器模式
  • 开发面试题-更新中...
  • ansible.builtin 和 ansible.posix的区别
  • leetcode hot100 之【LeetCode 141. 环形链表】 java实现