数据抽象指的是什么?请提供现实生活中的例子。
16 回答
抽象有两个部分:
- 隐藏从某个角度来看无关紧要的细节
- 确定从某个角度来看确实重要的细节,如果项目拥有这些细节,则认为它们属于同一类。
例如,如果我正在设计一个处理库存的程序,我希望能够找出系统中有多少特定类型的物品。从接口系统的角度来看,我不关心我是从数据库、csv 文件、通过 SOAP 接口或穿孔卡片的远程存储库获取这些信息的。我只关心我可以说widget.get_items_in_stock()
并且知道它将返回一个整数。
如果我以后决定要以其他方式记录该数字,则设计界面的人无需知道、关心或担心它,只要widget
仍有get_items_in_stock()
方法即可。同样,界面不需要关心我是否将小部件类子类化并添加get_square_root_of_items_in_stock()
方法。我也可以将新类的实例传递给它。
所以在这个例子中,我们隐藏了如何获取数据的细节,并决定任何带有get_items_in_stock()
方法的东西都是同一类(或其子类)的实例,用于某些目的。
数据抽象是允许您将数据视为人类遇到的任何设备,而不是存储在机器上的数据。
在最低级别,所有原始数据类型都是抽象——作为程序员,我们通常不必处理位级别的数据(这是最终存储的方式),而是整数、浮点数、字符等.
然后我们在这个抽象上添加层——也许两个整数代表 a Point
,或者我们和枚举代表一年中的月份、一周中的几天等。
对于每个抽象层,我们离机器更远,(希望)更接近人类对数据的理解。这可能会导致性能损失——点可能并不总是可以最有效地由两个整数表示。这可以通过使用抽象时更短的开发(和维护)时间来弥补。
创建非常适合要编程的应用程序的新数据类型的技术称为数据抽象。
抽象意味着只向外界提供基本信息并隐藏他们的背景细节......例如。在您的计算机中,您只能看到显示器、键盘和鼠标……您对内部布线一无所知,这是抽象。
数据抽象似乎被解释为尽可能地分解数据。食物将是苹果、橙子、比萨饼的抽象。动物将是猫、牛、猪的抽象。一个食物对象会是这样的伪代码:
class food{
name;
calories;
weight;
public eat(name);
}
所有食物都有名称、热量和重量。这很抽象。
然后,您可以创建继承的对象,这将不那么抽象。
class pizza inherits food{
toppings;
say_toppings();
}
比萨现在有配料,但它继承了食物的名称、卡路里和重量。
基本上抽象已被解释为到达每个项目的最低级别并制作从它们扩展的类。它也使您的代码更易于重用......如果您已经足够好地指示您的食物基类,并且包含关于它的所有抽象内容,那么在食品行业工作的任何人都可以使用您的类。
抽象是向人体隐藏骨骼。皮肤可以很好地控制它。(看看我在那里有多抽象?双关语是故意的。我离题了......)
如果我有一个水瓶,那么我可以打开盖子从里面喝水,扭动它直到它弹出来。
bool lid_open = false;
void open_water_bottle_by_twisting() { lid_open = true; }
但水瓶是容器。容器盛放液体,直到它们打开并且可以饮用(假设液体是可饮用的)。
class Container
{
bool lid_open = false;
protected:
Container() {}
void open_by_twisting()
{
lid_open = true;
}
public:
virtual ~Container();
};
class WaterBottle : public Container
{
WaterBottle() : Container() {}
public:
~WaterBottle();
};
但是,并非所有容器都以相同的方式打开。一些容器,例如水瓶,有可以拧开的盖子。其他的则没有盖子,例如运动瓶——那些包含可弯曲的吸管,可以弯下存放或向上饮用。
class Container
{
bool lid_open;
bool straw_open;
protected:
void TurnLid() { lid_open = true; }
void BendStraw() { straw_open = true; }
Container() : lid_open(false), straw_open(false){}
public:
virtual void open() = 0;
virtual ~Container();
};
class WaterBottle : public Container
{
public:
WaterBottle() : Container() {}
void open()
{
TurnLid();
}
~WaterBottle();
};
class ExerciseBottle : public Container
{
public:
ExerciseBottle() : Container() {}
void open()
{
BendStraw();
}
~ExerciseBottle();
};
但是客户不知道' sExerciseBottle
的实现是什么。它调用,然后设置为 true。但只需调用一个函数即可完成所有这些工作。客户端不必执行在. 情况类似。这就是抽象的含义:让客户知道后端将为它完成所有工作。当使用术语“将实现与接口分离”时,就是这个意思。ExerciseBottle
open()
BendStraw()
straw_open
ExerciseBottle
open()
WaterBottle
是使用易于与人类交互或遇到的数据细节的复杂系统,这与计算机系统存储的方式(例如二进制数字系统)不同。由 Neema、Rohan 和 Upendo(程序员)回答
根据给定的软件开发场景限制数据属性并删除所有不相关属性的技术。这使得软件开发更简单。
让我们以电视为例,您可以打开和关闭、更改频道、调节音量以及添加扬声器、VCR 和 DVD 播放器等外部组件,但您不知道它的内部细节,也就是说,您不知道它如何通过无线或电缆接收信号,如何转换它们,最后将它们显示在屏幕上。
它是指在不包括背景细节或解释的情况下表现本质特征的行为
很难找到 DATA 抽象的日常生活示例。但是,编程语言中的任何数据类型、DBMS 中的表和视图、LinkedList、List、Queue、Stack 等数据结构都是数据抽象。这些抽象为您提供了以特定方式访问数据的方法。
这篇文章可以帮助你深入理解数据抽象和控制抽象。它也有一些控制和数据抽象的真实例子。
抽象是指在不包括背景细节或解释的情况下表示基本特征的行为。
简单的数据抽象只不过是向用户隐藏不必要的数据。示例:某人只是想打电话,他只是选择或拨没有。并单击呼叫按钮此信息。对他来说已经足够了。他不想知道连接是如何建立的,以及拨打电话背后的任何过程或语音是如何传输的。
我知道这个问题很久以前就被问过了。但仍然喜欢分享一个现实生活中的例子,这可能有助于其他人abstraction
非常容易地理解概念。
现实世界的抽象类比可能是这样 的:您(对象)正在安排相亲并决定告诉他们什么,以便他们可以在餐厅认出您。您决定包括有关您的位置、身高、头发颜色和夹克颜色的信息。这是所有有助于程序(您找到您的日期)顺利进行的数据。您应该包括所有这些信息。另一方面,有很多关于你的信息与这种情况无关:你的社会安全号码、你最喜欢的足球运动员都与这种特殊情况无关,因为它们不会帮助你找到约会对象你。
数据抽象: 用于向用户提供必要的信息,对用户隐藏不必要的信息。它被称为数据抽象。它将向外界隐藏您的业务逻辑。
技术示例:Console.WriteLine();
非技术示例:电视遥控器、汽车遥控器。
更多细节:实时示例的数据抽象
数据隐藏处理 oops 的安全特性。根据这个属性,类的私有数据成员只能在类内部访问或可视化,而不能在类外部访问。