对OOP中“抽象”的定义感到困惑


16

我试图理解OOP中“抽象”的定义。

我遇到了一些主要定义。它们都有效吗?其中之一错了吗?我很困惑。(我用自己的话重新写了定义)。

定义1:

抽象是从现实世界中获取一些对象并将其转换为编程术语的概念。如创建Human类,并给予它int healthint ageString name等性质,和eat()等方法。

定义2:

更一般的定义。抽象是一个概念,它发生在软件系统中涉及“使事情变得更加通用/简单/抽象”的任何地方。一些例子:

  • 继承层次结构,其中较高的类更简单或更通用,并定义更通用和抽象的实现。而层次结构中的下层类则更为具体,并定义了更详细的实现。

  • 使用封装从其他类中隐藏类的实现细节,从而使该类对外部软件世界更加“抽象”(更简单)。

定义3

另一个通用定义:抽象是将重点从事物的细节和具体实现转移到事物的类型(即类),可用的操作(即方法)等概念,从而使编程更简单,更通用,更抽象。(这可以在软件系统中的任何位置和任何上下文中发生)。例如,它在封装时发生,因为封装意味着隐藏实现的细节,仅显示事物的类型及其更笼统和抽象的定义。Anotehr示例将使用ListJava中的对象。该对象实际上使用a ArrayList或a 的实现细节LinkedList,但是此信息使用更通用的名称来抽象List

这些定义是否正确?(我指的是最常规和公认的定义)。


抽象将“事物”定义为某种事物类型(动物=>狗),以进一步缩小事物的范围(狗=>贵宾犬)。
克里斯汀

Answers:


22

抽象是面向对象编程(OOP)的三大支柱之一。它的字面意思是从特定的角度感知系统或上下文中的实体。我们删去了不必要的细节,仅关注于所考虑的上下文或系统所必需的方面。

这里有一些很好的解释:

您作为一个人在不同的角色中具有不同的关系。当您在学校时,您就是“学生”。当您在工作时,您就是“雇员”。在政府机构工作时,您可以被视为“公民”。因此归结为我们在什么上下文中查看实体/对象。因此,如果我要为薪资系统建模,我将视您为雇员(PRN,全职/兼职,职称)。如果要对课程注册系统进行建模,那么我将考虑您作为学生的各个方面和特征(卷数,年龄,性别,已注册课程)。如果我要建立社会保障信息系统那么我将以您的公民身份查看您的详细信息(例如出生日期,性别,出生国家等)

请记住,抽象(专注于必要的细节)不同于封装(隐藏来自外部世界的细节)。封装意味着隐藏对象的细节,并为外部世界中的实体提供与该对象或实体进行交互的体面接口。例如,如果某人想知道我的名字,那么他就不能直接访问我的大脑细胞来知道我的名字。相反,那个人会问我的名字。如果驾驶员想加速车辆行驶,则可以使用一个接口(油门踏板,齿轮等)。

第一个定义不是很清楚。Def 2很好,但是当它试图将抽象与封装和继承链接时,它会使新手感到困惑。Def 3是3个定义中最好的一个,因为它清楚地定义了什么是Abstraction。


3
因此,您会说这像是概括而不是规范?
罗伯特·罗查

1
@samyismyhero确实!我们寻找对象的通用属性和行为以进行抽象。
Maxood

[动物=>狗]是一种抽象。您定义“动物”必须具有哪些可能的部分才能创建“狗”。(尾巴,腿,皮毛等)。然后,您可以使用“狗”类来定义贵宾犬,斗牛犬等。因此,您要基于“狗”类而不是“动物”声明狗的品种。
克里斯汀

3

定义1绝对不是抽象。那更贴切地描述了建模

定义2和3描述了同一件事。两者都是对抽象的很好的描述。


那正是我所想!abstract class Shape大声笑!
罗伯特·罗查

2

这些定义中的每一个都很好。

在抽象中,您只关注那些对您的目的很重要的细节。

在第一种情况下,您(目前)不能在代码中包含真实的人;您专注于为您服务的人的特定细节。在另一个程序中,您可能需要关注不同的细节。这些将是一个人的不同抽象,并且每个抽象在其上下文中都可以同样有效。

第二和第三个定义延续了这一思想,将其应用于软件实体。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.