数据抽象和信息隐藏有什么区别吗?经过这个链接中的所有答案后,我更加困惑。 Abstraction VS Information Hiding VS Encapsulation 找不到任何区别。只是我们可以将一个(信息隐藏)称为目标&另一个(抽象)作为一个过程?但这对我来说并不是令人满意的。此外,我得到封装是实现抽象过程的技术我在这里吗?请解释确切的区别。
答案 0 :(得分:6)
信息隐藏是指设计人员明确决定限制对实施细节的访问。它是一种比面向对象设计更古老的原则,但经常被使用。
一个简单的例子是在C中定义常量,例如#define NAME_SIZE 15
常量的代码(客户端)不需要知道它的值,如果你(不是)那就不会有麻烦设计师)决定稍后改变它的价值。他们不应该假设它确实是15,因为你可能决定改变它。
抽象是您处理聚合的时候,例如,汽车是机箱,电机,车轮等细节的抽象。抽象让我们想到复杂事情以更简单的方式。
封装是我们如何决定构成抽象的元素的详细程度。良好的封装应用信息隐藏,以强制执行细节限制。例如,我的汽车实际上包含了所有部件,但它只向我(驾驶员)提供了一个适合我需要而不是更多的界面。我可以控制门,锁,窗,灯,喇叭,天窗,运动的方向,加速,减速等。即使我可能好奇操纵"如何"的细节。所有这些东西,封装阻止我看到更多。
如果我的汽车的实施发生变化(我从内燃机变为电动或混合动力),因为我作为驾驶员只知道有限的接口,我不需要改变驾驶方式汽车。抽象让我知道我驾驶汽车,而不是数百件金属,橡胶等。
信息隐藏不汽车的一部分的示例可能是choke valve。我的父母告诉我那些曾经在他们驾驶的汽车上工作过的人......这是一种燃烧发动机的细节,在电动汽车中没用。
答案 1 :(得分:3)
数据隐藏是使用访问修饰符隐藏java方法和变量的可见性的过程。他们的访问修饰符有:public,private和protected。
抽象是我们通过抽象类和方法的bean定义特定行为的过程,这些抽象类和方法构成了将扩展此类的任何类的框架。
答案 2 :(得分:1)
“信息隐藏”是“数据抽象”的重要组成部分,但不是整个概念。
请记住:你可以(而且应该)在程序代码中有“信息隐藏”(比如FORTRAN或BASIC中的“不要使用全局变量”等) - 但是你不必拥有“抽象数据类型”
Information hiding和Abstract Data Types密切相关,但它们是不同的概念。
答案 3 :(得分:0)
一个类通常会从其客户端隐藏其实现细节。这称为信息隐藏。通过创建接口,我们召唤信息隐藏概念......
信息隐藏的例子如下...... 我们的头文件中有一个接口......
class Coder
{
public:
Coder();
void prints();
private:
int x;
};
并在另一个文件“Coder.cpp”中实现函数是......
Coder::Coder
{
x=10;//any int value you can take;
}
void Coder::prints()
{
cout<<x;
}
相反,在两个文件(一个标题+一个cpp文件)中执行上述操作,我们可以在一个地方完成它。我们可以在头文件本身中给出构造函数和打印函数的定义......
class Coder
{
public:
Coder()
{
x=10;//any int value you can take;
}
void prints()
{
cout<<x;
}
private:
int x;
};
如果我们这样做了,我们无法实现信息隐藏......我们的客户将知道我们如何实现我们的功能!
对于数据抽象,你可以考虑...堆栈的例子......
堆栈类的客户端不需要关心堆栈的实现。客户端只知道当数据项放在堆栈中时,它们将以后进先出顺序被调用。客户关心堆栈提供的功能,而不是关于如何实现该功能。这个概念被称为数据抽象。
答案 4 :(得分:0)
抽象是具有较少细节的东西的表示(如在抽象绘画中)。在OO中,可以在不承诺其内部表示的情况下操纵抽象类型。例如,可以操作电话号码作为电话号码的抽象,而客户不知道它包括国家代码,区域代码和实际号码。抽象在分析和设计阶段最有用,因为它允许您根据抽象数据类型(例如电话号码)进行交谈,而不必担心如何实施。
一种更熟悉的类型,string
是文本的抽象:你操纵string
而不知道它是如何实现的。字符串抽象允许更改其内部结构,而不会影响其在应用程序设计中的用法。
信息隐藏和封装是可以实现抽象数据类型的两种方式。抽象数据类型甚至可能不必隐藏其内部状态或其封装;例如,作为抽象的数字可以实现为int
。