封装与抽象?
Posted
技术标签:
【中文标题】封装与抽象?【英文标题】:Encapsulation vs Abstraction? 【发布时间】:2012-02-16 04:04:50 【问题描述】:以下是封装和抽象的简要定义。
抽象:
Java 中的抽象过程用于隐藏某些细节和 只显示物体的基本特征。换一种说法, 它处理对象(界面)的外部视图。我在不同网站上看到的唯一一个很好的例子是 界面。
封装:
它基本上是关于在帮助下隐藏对象的状态 修饰符,例如私有,公共,受保护等。我们通过暴露状态 仅在需要时使用公共方法。
我们使用private
、public
等修饰符实现的功能还隐藏了外界不必要的细节,这不过是一个抽象概念
所以,从上面的解释看来,封装是抽象的一部分,或者我们可以说它是抽象的一个子集。但是,当我们只能处理抽象时,为什么还要发明封装术语呢?我相信应该有一些主要区别可以区分它们,但网上的大多数材料对它们都说几乎相同的东西。
虽然这个问题之前也曾在这个论坛上提出过,但我还是带着具体的疑问再次发帖。一些回复还说抽象是一个概念,封装是实现。但我不买这个——如果是真的,那我可以认为这两个不同的概念是用来混淆我们的。
更新:- 5 年后,我想出了自己的答案,这是基于本文及以下答案的要点
-
difference between abstraction and encapsulation?
encapsulation vs abstraction real world example
【问题讨论】:
上面定义的封装是一种抽象工具,但是我倾向于将其视为类封装的内容(功能/数据,无论访问如何),而抽象更像是一种将您从对具体实现的关注,即无论它是如何完成的,以及究竟是做什么的,都可以从***An 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
封装更多的是绑定与上下文相关的相关细节(数据和对数据进行操作的行为)。它也可以在没有访问说明符的情况下实现,例如 private
public
,因为它们只提供信息/数据隐藏,我们这样做是因为这是保护实例数据的好习惯。
【参考方案1】:
抽象是用更简单的术语描述事物的概念,即抽象出细节,以便专注于重要的事情(这也出现在抽象艺术中,例如,艺术家专注于图像的构建块,例如颜色或形状)。同样的想法通过使用继承层次结构转化为 OOP,其中更抽象的概念位于顶部,更具体的想法位于底部,建立在它们的抽象之上。在其最抽象的层面上,根本没有实现细节,也许很少有共同点,随着抽象的减少而添加。
例如,在顶层可能是一个带有单个方法的接口,然后下一层提供了几个抽象类,这些抽象类可能会或可能不会填写有关顶层的一些细节,但通过添加它们的分支自己的抽象方法,那么对于这些抽象类中的每一个,都是提供所有剩余方法的实现的具体类。
封装是一种技术。它可能是也可能不是为了帮助抽象,但它肯定是关于信息隐藏和/或组织的。它要求以某种方式对数据和函数进行分组——当然,好的 OOP 实践要求它们应该按抽象进行分组。但是,还有其他用途只是有助于可维护性等。
【讨论】:
哇......抽象......用艺术表达......红色可能是愤怒,这就是我们需要知道的一切!感谢您对这个概念的看法:-) 封装用于实现“松耦合和高内聚”。【参考方案2】:封装是一种用作抽象一部分的策略。封装是指对象的状态——对象封装自己的状态并隐藏在外面;类的外部用户通过其方法与其交互,但不能直接访问类状态。所以类抽象了与其状态相关的实现细节。
抽象是一个更通用的术语,它也可以通过(以及其他)子类化来实现。例如,标准库中的接口List
是一系列项目的抽象,由它们的位置索引,List
的具体示例是ArrayList
或LinkedList
。与List
交互的代码会抽象出它正在使用哪种列表的详细信息。
如果不通过封装隐藏底层状态,抽象通常是不可能的 - 如果一个类暴露了它的内部状态,它就不能改变它的内部工作,因此不能被抽象。
【讨论】:
封装意味着一组相关的属性、方法和其他成员被视为一个单一的单元或对象。 msdn.microsoft.com/en-us/library/dd460654.aspx 封装导致抽象。【参考方案3】:封装是抽象的一部分,或者我们可以说它是 抽象
它们是不同的概念。
抽象是提炼所有 对象的不需要/不重要的属性,只保留 最适合您的域的特征。
例如对于一个人:您决定保留姓名和 SSN。 年龄、身高、体重等被忽略为无关紧要。
抽象是您设计的起点。
封装是识别适合于 您接受在抽象过程中保留的属性。它是 数据与作用于它们的操作的关联。 IE。数据和方法捆绑在一起。【讨论】:
能否说抽象是一种设计理念,而封装主要关注的是我们在抽象时约定好的设计的实现? 在封装中,您定义可以/必须应用于您的数据的操作。这也可以是设计的一部分。例如检索 SSN,但不修改它【参考方案4】:封装隐藏 不必要的数据在胶囊或单元中
抽象是显示 基本对象的特征
封装用于将其成员隐藏在外部类和接口之外。使用 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();
【讨论】:
我同意。这些家伙有点相反。好的 oop 倾向于抽象不会改变的事物并[封装会改变的事物][1]。 [1]:principles-wiki.net/…【参考方案5】:5 年后回答我自己的问题,因为我觉得它仍然需要更多细节
抽象:
技术定义:- 抽象是隐藏不必要的细节(复杂或简单)并仅显示对象的基本特征的概念。没有实现 这里只是一个概念
这实际上意味着什么:- 当我说我的公司需要一些媒介/设备以便员工可以连接到客户时。这是最纯粹的抽象形式(如接口 在java中)因为该设备/媒体可以是电话或互联网或Skype或亲自或电子邮件等。我不会深入了解设备/媒体
即使我说我的公司需要一些媒介/设备,以便员工可以通过语音通话与客户联系。然后我也在谈论抽象但在较低级别因为设备/媒体可以是电话或Skype或其他东西等
现在,当我说我的公司需要一些电话,以便员工可以通过语音通话与客户联系时。然后我也在谈论抽象但在较低级别,因为电话可能是 任何公司,如 iPhone、三星或诺基亚等
封装:- 它基本上是关于在私有、公共、受保护等修饰符的帮助下隐藏对象的状态(信息)。我们仅在需要时通过公共方法公开状态。
实际含义:- 现在当我说我的公司需要一些 iphone 以便员工可以通过语音通话与客户联系时。现在我正在谈论一些具体的对象(如 iphone)。虽然 我也不会在这里详细介绍 iphone,但 iphone 有一些与它相关的状态/具体信息/实现,而设备/媒体没有。当我说 具体对象,实际上它意味着任何具有一些(不像java抽象类那样完整)实现/信息与之关联的对象。
所以 iphone 实际上在这里使用封装作为隐藏其状态/信息并仅公开它认为应该公开的那些的策略。所以抽象和封装都隐藏了一些不必要的细节,但抽象在 概念层面和实际实现层面的封装
这是基于本文及以下答案的要点
-
difference between abstraction and encapsulation?
encapsulation vs abstraction real world example
【讨论】:
【参考方案6】:抽象是一个非常笼统的术语,软件中的抽象不仅限于面向对象的语言。字典定义:“将某物视为一般品质或特征的行为,而不是具体现实、特定对象或实际实例”。
汇编语言可以被认为是机器代码的抽象——汇编表达了机器代码的基本细节和结构,但让您不必考虑使用的操作码、代码在内存中的布局、跳转到正确的地址等。
您的操作系统的 API 是底层机器的抽象。您的编译器提供了一个抽象层,使您远离汇编语言的细节。操作系统中内置的 TCP/IP 堆栈抽象出通过网络传输位的细节。如果您一直深入到原始硅,那么设计您的 CPU 的人会使用用“二极管”和“晶体管”编写的电路图,它们是电子如何穿过半导体晶体的抽象。
在软件中,一切都是抽象的。我们构建程序来模拟或模拟现实的某些方面,但我们的模型必然会抽象出“真实事物”的一些细节。我们一层一层地构建抽象层,因为这是我们完成任何事情的唯一方法。 (想象一下,你正在尝试制作一个数独求解器,而你必须只使用半导体晶体来设计它。“好吧,我需要一块 N 型硅......”)
相比之下,“封装”是一个非常具体且有限的术语。这个问题的其他一些答案已经给出了很好的定义。
【讨论】:
【参考方案7】:封装 - 隐藏类的组件以防止从外部直接访问的过程。它是通过使用“private”修饰符来实现的,以防止其他类或对象直接访问某些类成员(数据字段或方法),同时提供公共成员(接口)对这些私有成员的访问。这使得班级成员被保护为隐藏/封装在皮肤或某些盾牌下的人体器官。
抽象 - 在编写 OOP 程序时必须遵循一个原则,即“您必须在类中仅包含对程序任务感兴趣的组件”。例如:对象 student 有很多作为人类的字符:姓名、年龄、体重、头发颜色、眼睛颜色等。但是,当你在 OOP 中创建一个类来与学生一起工作时,你应该只包括那些真正学生数据库事项:姓名,年龄,专业,水平,分数......等。 在 C++ 中,您可以通过将修饰符“virtual”与类中的任何方法一起使用来创建抽象类,这将使其无法直接使用,但您可以从中派生其他类并为其成员创建实现,并根据任务添加所需的成员.
【讨论】:
【参考方案8】:我是这样理解的:
在面向对象的编程中,我们有一个叫做classes的东西。它们是干什么用的?它们将存储一些状态并存储一些方法来更改该状态,即,它们是封装状态及其方法。
It(class) 不关心其自身或其内容的可见性。如果我们选择隐藏状态或者一些方法,那就是信息隐藏。
现在,以继承为例。我们有一个基类和几个派生(继承)类。那么,基类在这里做什么呢?它从派生类中抽象一些东西。
它们都是不同的,对吧?但是,我们将它们混合起来以编写好的面向对象程序。希望对你有帮助:)
【讨论】:
【参考方案9】:抽象描述特定于上下文的简化表示;它会忽略与上下文无关的细节,并包含与上下文无关的细节。
封装限制外部访问某事物的部分并将该事物的状态与使用该状态的过程捆绑。
以人为例。在手术的背景下,有用的抽象会忽略一个人的宗教信仰并包括人的身体。此外,人们用使用这些记忆的思维过程来封装他们的记忆。抽象不需要封装;例如,一幅人的画既不隐藏其部分,也不将程序与其状态捆绑在一起。而且,封装不需要有关联的抽象;例如,真实的人(不是抽象的人)用新陈代谢封装他们的器官。
【讨论】:
【参考方案10】:注意:我正在分享这个。并不是说这里不好回答而是因为我很容易理解。
答案:
当一个类被概念化时,在给定上下文的情况下,我们可以在其中拥有哪些属性。如果我们在动物园的上下文中设计一个 Animal 类,重要的是我们有一个作为 animalType 的属性来描述家养或野生。当我们在不同的上下文中设计类时,这个属性可能没有意义。
同样,我们在课堂上会有哪些行为?这里也应用了抽象。这里有什么必要的,什么是过量的?然后我们切断了课堂上的一些信息。此过程正在应用抽象。
当我们问封装和抽象之间的区别时,我会说,encapsulation 使用抽象作为一个概念。那么,它是否只是封装。不,抽象甚至是作为继承和多态的一部分应用的概念。
Go 这里有更多关于这个话题的解释。
【讨论】:
【参考方案11】:让我们尝试以不同的方式理解。
如果没有抽象会发生什么,如果没有封装会发生什么。
如果没有抽象,那么您可以说该对象使用较少。您无法识别该对象,也无法访问它的任何功能。以电视为例,如果你没有开机、换台、调高或调低音量等选项,那么电视有什么用,怎么用?
如果封装不存在或没有正确实现,那么您可能会滥用该对象。那里的数据/组件可能会被滥用。以电视为例,如果没有对电视的音量进行封装,那么音量控制器可能会被误用,使其低于或超出其限制(0-40/50)。
【讨论】:
【参考方案12】:封装保护从外部实体折叠对象/实例的内部行为。因此,应该提供一个控件来确认所提供的数据不会损害实例/对象的内部系统以使其存在。
很好的例子,Divider 是一个类,它有两个实例变量股息和除数以及一个方法 getDividedValue。
您能想一想,如果除数设置为 0,那么内部系统/行为 (getDivided) 将会中断。
因此,可以通过方法抛出异常来保护对象的内部行为。
【讨论】:
【参考方案13】:一句话,我可以说:抽象的本质是提取本质属性,省略无关紧要的细节。但是我们为什么要省略无关紧要的细节呢?关键的动力是防止变革的风险。您可能会认为抽象与封装相同。但是封装意味着将一个或多个项目封装在一个容器中,而不是隐藏细节。如果你提出“所有被封装的东西也被隐藏了”的论点。这显然不是真的。例如,即使信息可能被封装在记录结构和数组中,这些信息通常也不会隐藏(除非通过某种其他机制隐藏)。
【讨论】:
以上是关于封装与抽象?的主要内容,如果未能解决你的问题,请参考以下文章