封装与抽象? ?

下面是封装和抽象的简要定义。

摘要:

Java 中的抽象过程用于隐藏某些细节和 只显示物体的基本特征。换句话说, 它处理对象(接口)的外部视图。我在不同的网站上看到的唯一好的例子是 接口。

封装:

它基本上是关于隐藏对象的状态 我们通过诸如 private、 public、 protected 等修饰符公开状态 只有在有需要时才采用公开方法。

我们通过像 private这样的修饰符所实现的,public也向外界隐藏了不必要的细节,这些细节只不过是一个抽象概念

因此,从上面的解释看来,封装是抽象的一部分,或者我们可以说它是抽象的一个子集。但是当我们只能处理抽象的时候,为什么还要发明封装术语呢?我相信他们之间应该有一些重大的区别,但是网上的大多数材料对他们的说法几乎是一样的。

虽然这个问题早些时候也在这个论坛上提出过,但是我怀着特殊的疑问再次发布了它。一些回复还说抽象是一个概念,封装是一种实现。但我不相信,如果这是真的,那么我认为这两个不同的概念是为了迷惑我们。

更新:- 5年后,我想出了自己的答案,这是基于本文和以下答案的要点

  1. 抽象和封装的区别?
  2. 封装与抽象真实世界的例子
164463 次浏览

封装 是作为抽象的一部分使用的策略。封装是指对象的状态——对象封装它们的状态并对外隐藏; 类的外部用户通过其方法与其交互,但不能直接访问类的状态。所以类 摘要远离与其状态相关的实现细节。

抽象 是一个更通用的术语,它也可以通过子类化来实现。例如,标准库中的接口 List是一个项目序列的抽象,根据它们的位置进行索引,List的具体例子是 ArrayListLinkedList。与 List交互的代码根据它所使用的列表类型的细节进行抽象。

如果没有通过封装隐藏底层状态,抽象通常是不可能的——如果一个类暴露了它的内部状态,它就不能改变它的内部工作方式,因此也就不能被抽象。

封装是抽象的一部分,或者我们可以说它是 抽象

它们是不同的概念。

  • 抽象是将所有的 对象的不需要/不重要的属性,只保留 最适合你的领域的特性。

    例如,对于一个人: 你决定保留名字和姓氏以及 SSN。 年龄、身高、体重等因无关而被忽略。

    抽象是设计的起点。

  • 封装是它识别适合于 在抽象过程中保留的属性 数据与作用于它们的操作的关联。
    也就是说,数据和方法是捆绑在一起的。

抽象 是用更简单的术语描述事物的概念,即抽象出细节,以便专注于重要的东西(这也可以在抽象艺术中看到,例如,艺术家专注于构成图像的基石,如颜色或形状)。同样的思想通过使用继承层次结构转换为面向对象方法,在这个层次结构中,更抽象的概念位于顶部,而更具体的思想位于底部,构建在它们的抽象之上。在最抽象的层次上,根本没有实现细节,也许只有很少的共性,这些共性是随着抽象的减少而增加的。

例如,顶部可能是一个带有单个方法的接口,然后下一层提供了几个抽象类,这些类可能填充了顶部的一些细节,也可能没有填充,但是通过添加它们自己的抽象方法进行分支,这些抽象类中的每一个都是具体的类,提供了所有剩余方法的实现。

封装 技巧。它可能是或可能不是为了帮助抽象,但它肯定是关于信息隐藏和/或组织。它要求以某种方式对数据和函数进行分组——当然,良好的 OOP 实践要求它们应该通过抽象进行分组。然而,还有其他用途,只是帮助在可维护性等。

抽象是一个非常普遍的术语,软件中的抽象并不局限于面向对象语言。字典定义: “将某事物视为一般性质或特征的行为,与具体的现实、具体的对象或实际情况无关”。

汇编语言可以被认为是机器代码的抽象——汇编表达了机器代码的基本细节和结构,但是它使你不必考虑所使用的操作码、代码在内存中的布局、跳转到正确的地址等等。

操作系统的 API 是底层机器的抽象。编译器提供了一个抽象层,使您免受汇编语言细节的影响。嵌入到操作系统中的 TCP/IP 堆栈抽象出了通过网络传输位的细节。如果你一直追溯到原始的硅,那么设计你的 CPU 的人使用的是用“二极管”和“晶体管”写成的电路图,它们是电子如何通过半导体晶体的抽象。

在软件中,一切是一个抽象概念。我们编写程序来模拟或模拟现实的某些方面,但由于必要,我们的模型总是抽象出“真实事物”的某些细节。我们一层一层地构建抽象,因为这是我们完成任何事情的唯一方法。(想象一下,如果你想制作一个数独解题器,你必须只用半导体晶体来设计它。“好的,我需要一块 N 型硅...”)

相比之下,“封装”是一个非常具体和有限的术语。对这个问题的其他一些回答已经给出了很好的定义。

注意: 我正在分享这个,这并不意味着这里没有好的答案,而是因为我很容易理解。

回答:

当一个类被概念化时,在给定的上下文中我们可以拥有什么属性。如果我们在动物园的上下文中设计一个动物类,那么使用 animalType 属性来描述家畜或野生动物是非常重要的。当我们在不同的上下文中设计类时,此属性可能没有意义。

类似地,我们在课堂上会有哪些行为?这里还应用了抽象。这里有什么是必要的,什么将是一个过量?然后我们从课堂上剪掉了一些信息。这个过程正在应用抽象。

当我们询问封装和抽象之间的区别时,我会说,< strong > 封装 使用抽象作为一个概念。那么,它只是封装。不,抽象甚至是作为继承和多态性的一部分应用的概念。

在这里访问 以获得关于这个主题的更多解释。

我是这样理解的:

在面向对象编程中,我们有一个叫 课程的东西。这是干什么用的?它们存储一些状态,并存储一些方法来更改该状态,也就是说,它们是 封装状态及其方法。

它(类)不关心它自己或它的内容的可见性。如果我们 选择隐藏的状态或一些方法,它是 信息隐藏

现在,以 继承遗产为例。我们有一个基类和两个派生(继承)类。那么,基类在这里做什么呢?它是 抽象从派生类中输出的一些东西。

他们都不一样,对吧?但是,我们混合使用它们来编写良好的面向对象程序。希望对你有所帮助:)

封装是在胶囊或单元中的 躲起来 没必要数据

抽象是对象的 显示 至关重要特征

封装是用来对外部类和接口隐藏其成员的。使用 c # 中提供的访问修饰符,如 public、 private、 protected 等。 例如:

Class Learn
{
private int a;         // by making it private we are hiding it from other
private void show()   //class to access it
{
console.writeline(a);
}
}

这里我们有一个单元或胶囊中的封装数据,即类。

抽象恰恰是封装的对立面。

抽象用于向用户显示重要的相关数据。 现实生活中最好的例子 在移动电话中,你可以看到它们不同类型的功能,如摄像头、 MP3播放器、通话功能、录音功能、多媒体等。它是抽象的,因为你只看到相关的信息,而不是他们的内部工程。

 abstract class MobilePhone
{
public void Calling();       //put necessary or essential data
public void SendSMS();       //calling n sms are main in mobile
}


public class BlackBerry : MobilePhone   // inherited main feature
{
public void FMRadio();            //added new
public void MP3();
public void Camera();
public void Recording();


}

让我们试着用不同的方式来理解。

如果没有抽象会发生什么,如果没有封装会发生什么。

如果不存在抽象,那么可以说该对象使用较少。您无法标识该对象,也无法访问该对象的任何功能。以一台电视机为例,如果你没有开机、换台、增加或减少音量等选项,那么电视机的用途是什么? 你如何使用它?

如果没有执行封装或者没有正确实现封装,则可能会误用该对象。那里的数据/组件可能被滥用。以电视机为例,如果没有对电视机的音量进行封装,那么音量控制器可能会被误用,使其低于或超过其极限(0-40/50)。

封装 -隐藏类的组件以防止外部直接访问的过程。它是通过使用“私有”修饰符来防止从其他类或对象直接访问某些类成员(数据字段或方法) ,同时提供公共成员(Interface)对这些私有成员的访问来实现的。这使得职业成员像人体器官一样受到保护,隐藏在皮肤或者一些盾牌之下。

抽象 -在编写 OOP 程序时必须遵循这样一个原则: “您必须在类中只包含对程序的任务感兴趣的组件”。例如: 目标学生有很多字符作为一个人: 名字,年龄,体重,头发的颜色,眼睛的颜色,等等。但是,当您在 OOP 中创建一个与学生一起工作的类时,您应该只包含那些对学生数据库真正重要的字符: 姓名、年龄、专业、级别、分数等等。 在 C + + 中,你可以通过在类中的任何方法中使用修饰符“ Virtual”来创建抽象类,这会使它直接不可用,但是你可以从它派生出其他类,并为它的成员创建实现,根据任务添加所需的成员。

封装保护从外部实体折叠对象/实例的内部行为。因此,应该提供一种控制,以确认所提供的数据不会损害实例/对象的内部系统,从而使其存活下来。

举个很好的例子,Divider 是一个包含两个实例变量红利和除数的类,以及一个 getDividdValue 方法。

你能想象一下,如果除数设置为0,那么内部系统/行为(getDivide)就会中断。

因此,可以通过方法引发异常来保护对象的内部行为。

回答我自己的问题5年后,我觉得它仍然需要更多的细节

摘要:

技术定义: 抽象是一个隐藏不必要的细节(复杂或简单)的概念,只显示对象的基本特征。没有实施方案 这里只是一个概念

实际意义:- 当我说我的公司需要一些媒介/设备,这样员工就可以与客户联系。这是最纯粹的抽象形式(如接口) (java) ,因为该设备/媒体可以是电话、互联网、 skype 或亲自或电子邮件等。我不打算详细介绍设备/媒体的细节

即使我说我的公司需要一些媒体/设备,这样员工就可以通过语音电话与客户联系。然后我也谈论抽象,但在位较低的水平设备/媒体可以是电话或 skype 或其他东西等

现在,当我说我的公司需要一些电话,以便员工可以连接到客户通过语音电话。然后我也谈抽象,但在位较低的水平作为电话可以的 任何像 iphone,三星,诺基亚这样的公司

封装:- 它基本上是在 private、 public、 protected 等修饰符的帮助下隐藏对象的状态(信息) ,我们只在需要时才通过公共方法公开状态。

实际意义:- 现在,当我说我的公司需要一些 iphone,以便员工可以通过语音电话与客户联系。现在我谈论一些具体的对象(如 iphone)。尽管如此 我在这里也不打算详细介绍 iphone,但是 iphone 有一些与之相关的状态/具体信息/实现,而设备/媒体没有这些信息/实现。当我说 具体的对象,实际上它意味着任何与之相关的对象(不像 java 抽象类那样完整)的实现/信息。

所以 iphone 实际上在这里使用了封装作为策略来隐藏它的状态/信息,并且只暴露它认为应该暴露的信息。因此,抽象和封装都隐藏了一些不必要的细节,但是在 概念层次和封装实际上在实现层次

这是基于本文和以下答案的要点

  1. 抽象和封装的区别?
  2. 封装与抽象真实世界的例子

抽象描述了特定于上下文的、简化了的表示; 它忽略了与上下文无关的细节,包括了与上下文有关的重要细节。

封装通过使用状态的过程限制 对事物的部分 和捆绑状态的外部访问。


以人为例。在外科手术的背景下,一个有用的抽象概念忽略了一个人的宗教信仰,包括了这个人的身体。此外,人们用使用这些记忆的思维过程来封装他们的记忆。抽象不需要封装; 例如,人物画既不隐藏其部分,也不将过程与其状态捆绑在一起。并且,封装不需要相关的抽象; 例如,真实的人(不是抽象的人)用他们的新陈代谢封装他们的器官。

在一个简单的句子中,我可以说: 抽象的本质是提取本质属性,而省略不必要的细节。但我们为什么要忽略无关紧要的细节呢?关键的动机是防止变化的风险。您可能认为抽象与封装是相同的。但是封装意味着将一个或多个项目封装在一个容器中,而不是隐藏细节。如果你认为“所有被封装的东西都是隐藏的”这显然不是真的。例如,即使信息可以封装在记录结构和数组中,这些信息通常也不会被隐藏(除非通过其他机制隐藏)。