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

Sat*_*tya 3 java oop

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

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

Kon*_*man 13

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

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

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


djn*_*jna 12

抽象是关注对象的一些关键特征,并故意忽略其他特征.例如,以下具有以下共同点:

Plane
Train
Automobile
Run Code Online (Sandbox Code Playgroud)

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

getNumberOfWheels()
Run Code Online (Sandbox Code Playgroud)

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

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

 getSalary()
Run Code Online (Sandbox Code Playgroud)

现在我们看到一些有趣的事 对于看门人而言,薪水是按照计算的

 hoursWorked * paymentPerHour
Run Code Online (Sandbox Code Playgroud)

对于销售人员而言

 baseSalary + commision
Run Code Online (Sandbox Code Playgroud)

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

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

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