【问题标题】:Difference in Information hiding and data abstraction?信息隐藏和数据抽象的区别?
【发布时间】:2011-11-06 06:18:27
【问题描述】:
【问题讨论】:
标签:
oop
abstraction
information-hiding
【解决方案1】:
信息隐藏是设计者特别决定限制对实现细节的访问。这是一个比面向对象设计更古老的原则,但经常被使用。
一个简单的例子是在 C 中定义常量,例如,#define NAME_SIZE 15 常量的代码(客户)不需要知道它的值,如果你(设计者)决定改变它也不会感到困扰以后值。他们不应该假设它真的是 15,因为你可能决定改变它。
抽象是当您处理聚合时,例如,汽车是对底盘、电机、车轮等细节的抽象。抽象使我们能够考虑复杂的事物更简单的方法。
封装是我们决定组成抽象的元素的详细程度的方式。良好的封装应用信息隐藏,以强制执行细节限制。例如,我的汽车实际上由它的所有部分组成,但它只为我(驾驶员)提供了一个适合我需要的界面,而不是更多。我可以控制门、锁、窗户、灯、喇叭、天窗、运动方向、加速、减速等。尽管我可能很想操纵所有这些“如何”的细节,但封装可以防止我从看到更多。
如果我的汽车的实现发生了变化(我从内燃机改为电动或混合动力),因为我作为驾驶员只知道有限的接口,我不需要改变我驾驶汽车的方式。抽象让我只知道我在开车,而不是数百块金属、橡胶等。
信息隐藏不是汽车的一个例子可能是choke valve。我的父母告诉我,那些人过去是如何在他们驾驶的汽车上工作的……这是一个内燃机细节,在电动汽车中是没有用的。
【解决方案2】:
数据隐藏是使用访问修饰符隐藏java方法和变量的可见性的过程。它们的访问修饰符是:public、private 和 protected。
抽象是我们通过抽象类和方法的 bean 定义特定行为的过程,这些抽象类和方法构成了将扩展此类的任何类的骨架。
【解决方案4】:
一个类通常对其客户隐藏其实现细节。这称为信息隐藏。通过创建接口,我们唤起了信息隐藏的概念......
信息隐藏示例如下...
我们的头文件中有一个接口...
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;
};
如果我们这样做了,我们就无法实现信息隐藏......我们的客户会知道我们是如何实现我们的功能的!
对于数据抽象,您可以考虑...堆栈示例...
堆栈类的客户端不需要关心堆栈的实现。客户端只知道当数据项被放入堆栈时,它们将按照后进先出的顺序被调用。客户关心堆栈提供什么功能,而不是如何实现该功能。这个概念被称为数据抽象。
【解决方案5】:
抽象是用较少细节表现事物(如抽象画)。在 OO 中,可以在不提交其内部表示的情况下操作抽象类型。例如,电话号码作为电话号码的抽象可以在客户端不知道它由国家代码、地区代码和实际号码组成的情况下进行操作。抽象在分析和设计阶段最有用,因为它允许您根据抽象数据类型(例如电话号码)进行讨论,而不必担心它将如何实现。
一种更熟悉的类型,string 是文本的抽象:您在不知道它是如何实现的情况下操作 string。字符串抽象允许在不影响其在应用程序设计中的使用的情况下更改其内部结构。
信息隐藏和封装是实现抽象数据类型的两种方式。抽象数据类型甚至可能不必隐藏其内部状态或封装;例如,作为抽象的 Number 可以实现为 int。