封装与抽象?

这里是封装和抽象的简单定义。

抽象:

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

封装:

它基本上是隐藏的对象的状态,像私人,公共,保护等修饰符的帮助下,我们只有在需要的情况下通过公开的方法暴露国家。

我们用privatepublic等修饰符实现的function,也从外面的世界隐藏了不必要的细节,这只不过是一个抽象的概念

所以,从上面的解释看来封装是抽象的一部分,或者我们可以说它是抽象的一个子集。 但是,为什么封装术语只能在抽象化的时候发明呢? 我相信应该有一些重大的区别,但是网上的资料大部分都是一样的。

虽然这个问题在这个论坛上也提过了,但是我再次发表了一些具体的疑问。 有些答复也说抽象是一个概念,封装是实现。 但我不买这个 – 如果这是真的,那么我可以认为这两个不同的概念提供给我们混淆。

更新: – 5年后,我已经拿出了我自己的答案这是基于这个post和下面的答案的要点

  1. 抽象和封装之间的区别?
  2. 封装vs抽象现实世界的例子

封装是一种用作抽象的一部分的策略。 封装是指对象的状态 – 对象封装它们的状态并将其隐藏起来; 类的外部用户通过它的方法与它交互,但不能直接访问类的状态。 所以这个类抽象出与其状态相关的实现细节。

抽象是一个更通用的术语,也可以通过(其他)子类来实现。 例如,标准库中的接口List是一系列项目的抽象,由它们的位置索引, List具体示例是ArrayListLinkedList 。 与List交互的代码抽象出它正在使用的列表的types的细节。

如果没有通过封装来隐藏基础状态,抽象往往是不可能的 – 如果一个类暴露了它的内部状态,它就不能改变它的内部工作,因此不能被抽象。

抽象是用更简单的术语来描述某些东西的概念,即抽象出细节,以专注于重要的东西(这也可以在抽象艺术中看到,例如,艺术家关注图像的构build块,比如颜色或形状)。 同样的想法转化为面向对象的使用inheritance层次结构,其中更抽象的概念是顶部和更具体的想法,在底部,build立在他们的抽象。 在最抽象的层面上,根本没有实现细节,也许只有很less的共同点,随着抽象的减less而增加。

举个例子,顶层可能是一个单一方法的接口,那么下一层就提供了几个抽象类,这些抽象类可能会或者可能不会填充关于顶层的一些细节,但是通过添加自己的抽象方法,那么这些抽象类中的每一个都是提供所有其余方法的实现的具体类。

封装是一种技术 。 它可能会也可能不会帮助抽象,但它肯定是关于信息隐藏和/或组织。 它要求以某种方式对数据和function进行分组 – 当然,良好的面向对象的实践要求它们应该通过抽象来分组。 但是,还有其他的用途,只是有助于可维护性等。

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

他们是不同的概念。

  • 抽象是细化一个对象的所有不必要/不重要的属性,只保留最适合你的领域的特征的过程。

    例如,对于一个人:你决定保留姓名和SSN。 年龄,身高,体重等都被视为无关紧要。

    抽象是你的devise开始的地方。

  • 封装是下一步,它可以识别适合于您在抽象过程中保留的属性的操作。 数据与操作之间的关联是对它们的行为。
    即数据和方法捆绑在一起。

封装是 不必要的数据隐藏在胶囊或单元中

抽象显示了一个对象的基本特征

封装是用来隐藏其成员从外部类和接口。使用访问修饰符提供的c#。如公共,私人,受保护等。例如:

 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); } } 

在这里,我们将数据封装在一个单元或胶囊中,即Class。

抽象与封装相反。

抽象用于向用户显示重要和相关的数据。 最好的现实世界的例子在手机中,你可以看到他们的不同types的function,如相机,MP3播放器,通话function,录音function,多媒体等。这是抽象的,因为你只看到相关信息而不是内部工程。

  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(); } 

抽象是一个非常普遍的术语,软件抽象并不局限于面向对象的语言。 字典定义:“除了具体的现实,特定的对象或实际情况之外,把事物看作是一般的质量或特性的行为”。

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

您的操作系统的API是底层机器的抽象。 您的编译器提供了一个抽象层,可以屏蔽汇编语言的细节。 内置于操作系统中的TCP / IP协议栈将通过networking传输比特的细节抽象出来。 如果你一路走下原始硅片,devise你的CPU的人就会用“二极pipe”和“晶体pipe”这些电子如何通过半导体晶体的抽象概念来编写电路图。

在软件中, 一切都是抽象的。 我们build立的模拟或模拟现实的某些方面的程序,但是我们的模型必然总是抽象出一些“真实的东西”的细节。 我们在抽象层上构build层,因为这是我们完成任何事情的唯一方法。 (想象一下,你正在试图做一个数独解算器,而且你只能用半导体晶体来devise它,“好吧,我需要一块N型硅片……”)

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

5年后回答我自己的问题,因为我觉得还需要更多的细节

抽象:

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

这实际上意味着什么: –当我说我的公司需要一些媒介/设备,以便员工可以连接到客户。 这是最纯粹的抽象forms(如java中的接口),因为设备/媒体可以是电话或互联网,也可以是Skype,也可以是个人或电子邮件等。我不想进入设备/媒体的细节

即使我说我的公司需要一些媒介/设备,以便员工可以通过语音呼叫连接到客户。 那么我也是抽象的说话,但是因为设备/媒介可能是电话或者Skype或者其他的东西,所以在一些较低的层面上

现在当我说我的公司需要一些电话,以便员工可以通过语音通话连接到客户。 那么我也是抽象的说话,但是电话可以是任何像iphone,三星,诺基亚等公司的

封装: –它基本上隐藏的对象的状态(信息)与私人,公共,保护等修饰符的帮助下,我们通过公开的方法暴露状态,只有当需要。

这实际上意味着什么: –现在当我说我的公司需要一些iPhone,以便员工可以通过语音通话连接到客户。现在我正在谈论一些具体的对象(如iPhone)。 尽pipe我也没有深入iPhone的基本内容,但是iPhone在设备/介质没有的地方还是有一些与之相关的状态/结构信息/实现。 当我说具体的对象,实际上它意味着任何有一些(不完全像Java抽象类)实现/信息相关的对象。

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

这是根据这篇文章和下面的答案的要点

  1. 抽象和封装之间的区别?
  2. 封装vs抽象现实世界的例子

封装 – 隐藏类的组件以防止从外部直接访问的过程。 它通过使用“私有”修饰符来防止从其他类或对象直接访问某些类成员(数据字段或方法),同时由公共成员(接口)提供对这些私有成员的访问。 这使得人类的器官被隐藏/包裹在皮下或者一些盾牌下面,从而得到保护。

抽象 – 在写OOP程序时必须遵循一个原则,即“你必须在课程中包含对程序任务感兴趣的组件”。 例如:对象学生有很多人物angular色:姓名,年龄,体重,头发颜色,眼睛颜色等等。但是,当您在OOP中创build一个class级与学生一起工作时,您应该只包含那些真正的学生数据库的问题:在C ++中的名称,年龄,专业,级别,标志等,您可以使用修饰符“虚拟”与类中的任何方法创build抽象类,这将使其无法直接使用,但您可以从中派生其他类并为其成员创build实现,并根据任务添加所需的成员。

这是我的理解:

在面向对象编程中,我们有一些叫做类的东西。 他们是为了什么? 他们要存储一些状态,并存储一些改变状态的方法,即封装状态和方法。

它(class)不关心自己或其内容的知名度。 如果我们select隐藏国家或一些方法,那就是信息隐藏

现在,采取inheritance的情况。 我们有一个基类和几个派生(inheritance)类。 那么,基础class在这里做什么? 它从派生类中抽象出一些东西。

他们都不一样,对吧? 但是,我们把它们混合起来编写好的面向对象的程序。 希望能帮助到你 :)

抽象描述了一个特定于上下文的简化的表示; 它忽略了上下文无关的细节,并且包含了上下文重要的细节。

封装限制外部访问某些东西的部分, 并将该东西的状态与使用状态的过程捆绑在一起。


以人为例。 在手术的背景下,一个有用的抽象忽略了一个人的宗教信仰,并且包含了这个人的身体。 而且,人们用使用这些记忆的思维过程来包装他们的记忆。 抽象不需要封装; 例如,一幅人物画既不隐藏,也不与程序捆绑在一起。 并且,封装不需要关联抽象; 例如,真正的人(而不是抽象的人)用自己的新陈代谢来封装自己的器官。

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

回答:

当一个类被概念化时,根据上下文我们可以拥有哪些属性。 如果我们在一个动物园的背景下devise一个动物类,重要的是我们有一个动物类属性来描述国内的或野生的。 当我们在不同的上下文中devise类时,这个属性可能没有意义。

同样的,我们在课堂上会有什么样的行为? 抽象也适用于这里。 这里有什么必要的,什么是过量的? 然后,我们切断了class上的一些信息。 这个过程是应用抽象。

当我们要求封装和抽象之间的区别时,我会说, 封装使用抽象概念。 那么,这只是封装。 不,抽象甚至是一个适用于inheritance和多态的一部分的概念。

这里获得关于这个话题的更多解释。

让我们尝试以不同的方式来理解。

如果抽象不存在,可能会发生什么,如果封装不存在,可能会发生什么。

如果抽象不在那里,那么你可以说对象是less用的。 您不能识别对象,也不能访问它的任何function。 举一个电视的例子,如果你没有开机的选项,改变频道,增加或减less音量等,那么电视有什么用,你是怎么用的?

如果封装不存在或没有正确执行,则可能会滥用该对象。 数据/组件可能会被滥用。 以电视机的例子来说,如果没有对电视机的音量进行封装,那么音量控制器可能被低于或超出其极限(0-40 / 50)而误用。

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

很好的例子,Divider是一个有两个实例variablesdividend和divisor和一个方法getDividedValue的类。

你可以想一下,如果除数设置为0,那么内部系统/行为(getDivided)将会中断。

所以,对象的内部行为可以通过一个方法抛出exception来保护。