困惑:抽象和封装是一样的吗?

可能重复:
抽象VS信息隐藏VS封装

“抽象”和“封装”的定义看起来与我非常相似。 我总是混淆这些条款。 请通过展示示例来澄清差异。

在这个论坛post中提供了一个简短但明确的(我认为)答案:

封装有两面; 数据抽象和信息隐藏。 数据抽象是从外部看到的类型。 信息隐藏是从内部看到的类型。

  • 抽象侧重于对象的外部视图(即界面)
  • 封装(信息隐藏)可防止客户端看到其内部视图,其中实现了抽象的行为

抽象是关注对象的一些关键特征,并故意忽略其他特征。 例如,以下内容有什么共同之处:

Plane Train Automobile 

对,他们都有轮子! 我们的对象模型有一个方法。

 getNumberOfWheels() 

我们已经抽象出了我们关心这个特定问题的共同特征。 当然,你可能期望一些其他抽象专注于numberOfPassengers()或speed(),但我们的想法是我们正在一些特定的问题领域工作,因此专注于某些特定的抽象。

在一个更现实的例子中,我们可能有Janitor,高级执行官,销售人员,经理等等。 而我们的抽象主要集中在他们的付款上。 所以我们有

  getSalary() 

现在我们看到一些有趣的事 对于看门人来说,工资是按照计算的

  hoursWorked * paymentPerHour 

对于销售人员而言

  baseSalary + commision 

但是当我们看抽象getSalary()时,我们看不到那些细节,只能回答“工资是多少”的问题; 我们已经封装了薪水计算。

抽象:识别从外部看到的相关基本特征

封装:隐藏有关如何实现这些function的详细信息

它们实际上是相关的。

抽象是指对象或概念的高级视图。 例如, 汽车是一种抽象,它提供高水平的视图而不涉及细节(例如门,方向盘,座椅等)。 基类通常是将常见属性分开的抽象。

封装更进了一步,隐藏了抽象的实现细节。 例如,您知道汽车有门,方向盘,座椅等,但您不得了解这些元素的实施细节(这些细节是封装的)。

抽象它是一个类,它定义了扩展它的类的行为。 仅此而已。

封装它定义了类的哪些方法和属性是可访问的。

结论你做了错误的比较,他们是完全不同的。

然而,大多数人在界面和抽象类之间感到困惑,这似乎是一个很小的逻辑问题,但那又不是那么正确的问题。

它们非常不同,实际上……

抽象:以简化/不同的方式呈现某些东西的想法,这种方式要么更容易理解和使用,要么与情况更相关。

考虑一个发送电子邮件的类……它使用抽象向你展示自己作为某种信使的男孩,所以你可以调用emailSender.send(邮件,收件人)。 它实际上做了什么 – 选择POP3 / SMTP,调用服务器,MIME翻译等,被抽象掉了。 你只看到你的使者男孩。

封装:保护和隐藏对象专用的数据和方法的想法。 它更多地涉及制作独立且万无一失的东西。

以我为例。 我把心率从世界其他地方封装起来。 因为我不希望任何其他人改变该变量,我不需要任何其他人来设置它以便我运行。 它对我来说至关重要,但你不需要知道它是什么,你可能也不在乎。

环顾四周你会发现你触摸的几乎所有内容都是抽象和封装的一个例子。 例如,您的手机向您展示了能够接受您所说的话并向其他人说出的抽象 – 涵盖GSM,处理器架构,无线电频率以及您不理解或不关心的其他一百万件事。 它还封装了您的某些数据,如序列号,ID号,频率等。

这一切都让世界变得更加美好:D