【问题标题】:encapsulation vs abstraction real world example封装与抽象现实世界的例子
【发布时间】:2012-08-17 20:50:06
【问题描述】:

对于封装的例子,我可以想到用户和手机之间的交互。用户不需要知道手机内部的工作原理就可以进行操作,所以这叫做抽象。但是封装在这个例子中适合什么地方呢?有人可以解释一下吗?

【问题讨论】:

  • 对每部手机的详细信息的简单封装允许 apk 编写者开发一个适用于所有安卓设备的应用程序。
  • 好吧,我更喜欢一个与编程无关的例子。
  • 你明白堆栈溢出是针对编程问题的吧?
  • @asawyer - 这与编程有何关系?理解这一点对于成为一名称职的开发人员至关重要......使用各种示例来理解概念至关重要。如果我做出仓促的判断 - 我会说你一定不是一个很好的开发人员。
  • 用户不需要知道手机内部的工作原理就可以进行操作,这叫做封装(信息隐藏)而不是抽象。为什么你觉得它和抽象是一样的?

标签: oop programming-languages


【解决方案1】:

让我通过你给出的关于手机的例子来解释抽象和封装。

抽象

手机内部的工作对用户是隐藏的。用户通过屏幕/按钮与手机进行交互。这相当于通过对象与类进行交互。这里的类是移动设备,对象是屏幕/按钮。

封装

在手机中,我们可以看到电池、CPU、RAM、摄像头等一起被包含在一个盒子/容器中。这类似于类如何封装其所有方法和变量。方法和变量都包含在类中。

另外,你不能访问手机的内部组件吧?为此,您需要特殊的螺丝刀。手机内部的组件是安全的。同样,我们可以保护类中的组件或变量。我们使用私有访问修饰符保护它。私有访问修饰符是手机的容器。我们可以在 setter 和 getter 的帮助下访问私有字段。这些 getter 和 setter 就像特殊的螺丝刀。

【讨论】:

    【解决方案2】:

    抽象:你永远不会买“设备”,但总是买更具体的东西:iPhone、GSII、诺基亚 3310...这里,iPhone、GSII 和 N3310 是具体的东西,设备是抽象的。

    封装:你有几个设备,它们都有一个 USB 端口。你不知道后面是什么样的印刷电路,你只需要知道你可以将 USB 电缆插入它。

    抽象是一个概念,通过封装允许。我的例子不是最好的(两个块之间没有真正的联系)。

    您可以在不使用抽象的情况下进行封装,但如果您想在项目中使用一些抽象,则需要封装。

    【讨论】:

    • 你可以在不使用抽象的情况下进行封装,但是如果你想在你的项目中使用一些抽象,你需要封装
    • @zessx。我不确定我们如何在没有抽象的情况下进行封装。每当我们进行封装时,它都会以某种方式导致抽象。不是吗?
    • @MSach 我认为我的“封装”示例不太好,因为我谈到了“几个设备”。拿 一部 电话,它有一个 USB 端口。我们将敏感信息隐藏为印刷电路,但您可以访问简化且安全的 USB 接口。这与抽象无关。
    • @zessx 但即使是We're hidding you sensitive information, as the printed circuit,..,我们也会抽象出不必要的细节。我同意您的示例不是完全抽象,而是以某种方式抽象。虽然它总是一个有争议的话题:)。我根据 SO 上各种类似链接的摘要在 stackoverflow.com/questions/8960918/… 上发布了我的答案
    【解决方案3】:

    封装就是把变量或者东西隐藏在一个类里面,防止未经授权的人使用。所以像getter和setter这样的公共方法访问它,其他类调用这些方法进行访问

    抽象涉及定义代表抽象“参与者”的对象的工具,这些参与者可以执行工作、报告和更改其状态,以及与系统中的其他对象“通信”。

    考虑以下实时示例:

    封装: 作为驾驶员,您知道如何通过按下启动按钮启动汽车,启动操作的内部细节对您来说是隐藏的。所以整个启动过程对你是隐藏的,否则我们可以看出启动操作是对你封装的。

    或

    驱动轮封装了你转动轮子的过程。

    抽象:

    在提及抽象之前,我们可以在这里取三个不同的用户(我称他们为实体)

    1) 你 2) 本地机械师 3) 专家

    你的实体:因为你只知道按下按钮启动汽车,而幕后的所有其他操作都是从你身上抽象出来的。

    当地机械师实体:我们当地的机械师知道一些启动汽车的实现,即他可以打开汽车的引擎盖并检查电池电缆或塞子等。总之,当地机械师实体知道一些汽车的实现。

    专家实体:由于我们的专家(汽车设计师)机械师了解我们汽车的所有操作,因此他可以很快修复它。所以简而言之,专家实体知道汽车的所有实现。

    汽车的操作完全由你抽象出来,部分实现给本地机械实体,完全实现给专家实体。所以你是一个只有抽象方法的抽象类,Local Mechanic Entity 扩展了你(因为他也是一个普通用户),他实现了一些方法,最后我们的专家实体扩展了 Local Mechanic 并实现了所有方法 .

    我觉得这个不错example.

    【讨论】:

    • 通俗易懂的最佳例子
    • 最佳解释。我正在寻找代码解释。
    【解决方案4】:

    抽象

    我们在日常生活中使用了许多抽象概念。以汽车为例。我们大多数人都对汽车的工作原理有一个抽象的看法。我们知道如何与它进行交互以让它做我们想做的事情做:我们加油,转动钥匙,踩一些踏板,等等。但我们不一定了解汽车内部发生了什么以使其移动,我们也不需要。 数以百万计的人每天都在使用汽车,却不了解汽车的工作原理。抽象有助于我们上学或上班!

    可以将程序设计为一组交互抽象。在 Java 中,这些抽象被捕获在类中。类的创建者显然必须知道它的接口,就像汽车司机可以在不知道引擎如何工作的情况下使用车辆一样。

    封装

    考虑一个银行系统。银行系统具有帐号、帐户类型、余额等属性。如果有人试图更改账户余额,如果没有封装,尝试可以成功。 因此封装允许类完全控制它们的属性。

    【讨论】:

      【解决方案5】:

      封装是实现"information hiding"的一种方式,所以,按照你的例子,你不需要“需要知道手机的内部工作原理才能操作”用它。您有一个接口,可以在不知道实现细节的情况下使用设备行为。

      另一方面,

      抽象可以解释为对不同对象使用相同接口的能力。可以存在同一接口的不同实现。 封装隐藏了细节。

      【讨论】:

        【解决方案6】:

        封装就是隐藏信息。

        抽象隐藏了功能细节。

        封装是通过构造类来执行的。抽象是通过在类之上创建抽象类或接口来实现的。

        在问题中给出的示例中,我们使用该类来实现其功能,我们并不关心设备如何实现这一点。所以我们可以说手机的细节是从我们这里“抽象”出来的。

        封装隐藏了手机使用什么来实现它的功能;抽象隐藏了它是如何做到的。-

        【讨论】:

          【解决方案7】:

          让我拿出 2 美分来与 IT 接近的现实世界示例类比。

          假设您有一个订阅网站,例如 wordpress 网站

          每个用户都有一个角色,例如管理员、订阅者等。许多用户可以是管理员、订阅者等。

          所以这里的抽象反映事实上,任何具有管理员角色的用户都可以做一系列事情,这与哪个特定用户无关(这是抽象的示例)。

          另一方面,订阅者用户无权访问网站的某些设置,因此应用程序的某些内部结构被封装给普通订阅者(这是封装的一个示例)

          正如我们所看到的,抽象和封装是相对的概念,它们适用于特定的事物。

          可以按照这种推理方式解释多态性和继承。

          例如,超级管理员用户可以做管理员用户可以做的所有事情,而且还可以做更多事情。此外,如果管理员角色获得功能更新,超级管理员将获得相同的更新。因此,可以在此处看到 继承 的示例,其中超级管理员角色继承 管理员角色的所有属性并对其进行扩展。 注意,对于网站的大部分内容,管理员可以与超级管理员互换(这意味着超级管理员用户可以轻松地代替管理员用户,但反之亦然)。

          【讨论】:

            【解决方案8】:

            每样东西都有很多属性和行为,所以随便拿电视、手机、汽车、人或任何东西。

            抽象:

            1. 挑选您真正需要的对象的本质的过程
            2. 换句话说,从对象中选择您需要的属性 示例:
              a. 电视 - 声音、视觉效果、电源输入、频道输入。
              b. 移动设备 - 按钮/触摸屏、电源按钮、音量按钮, sim 端口。
              c. 汽车 - 转向、刹车、离合器、加速器、钥匙孔。
              d. 人类 - 声音、身体、视力、听力,情绪。

            封装:

            1. 隐藏不需要的对象详细信息的过程
            2. 换句话说,隐藏对象中不需要但对象正常工作所必需的属性和操作 示例:
              a. 电视 - 扬声器、显示器、配电 b/w 组件、通道机制的内部和连接。
              b. 移动 - 如何输入被解析和处理,如何按下按钮开/关或改变音量,sim 将如何连接到服务提供商。
              c. 汽车 - 转向如何转动汽车,如何刹车慢或停止汽车,离合器如何工作,加速器如何提高速度,钥匙孔如何打开/打开汽车。
              d. 人类 - 声音是如何产生的,身体内部是什么,视力如何工作,听力如何工作,情绪如何产生和影响我们。

            抽象出你需要的一切,封装你不需要的一切;)

            【讨论】:

            • 在我读到抽象与封装之前的最佳定义......很好......
            • ABSTRACT everything you need and ENCAPSULATE everything you don't need - 简单有效
            【解决方案9】:

            抽象

            它用于管理 OOP 的复杂性。通过使用此属性,我们可以向用户提供对象的基本特征,而不包括其背景说明。例如,当向朋友发送消息时,我们只需编写消息,说“hiiii”并按“发送”,消息就会被传递到其目的地(她,朋友)。在这里我们看到了抽象的工作,即我们不太关心负责发送和接收消息的移动设备的内部工作

            【讨论】:

              【解决方案10】:

              当您看到编程中的“如何不做”时,我觉得讨论封装可能更有意义。例如,考虑如下 Car 类。

               class Car{
                 public float speed =0;
                 public boolean isReverse = false;
                 public boolean isStarted = false;
               }
              

              客户端代码可以使用上面的汽车类,如下所示。

              class Main{
                public static void main(args String[]){
                 Car car = new Car();
                 // No need to start??
                 car.speed = 100; // Turbo mode directly to 100
                 car.speed = 0; // Turbo break
                }
              }
              

              查看更多信息:http://brevitaz.com/encapsulation-example-benefits-java/

              这是对汽车速度和其他变量的不受控制的访问。通过封装,Car 类可以完全控制 car 类中的数据变量如何被修改。

              任何具有某种行为的具体实体都是封装的示例。行为是通过包裹某些东西并向客户端隐藏某些东西来提供的。在移动设备的情况下,它是信号、芯片、电路、电池等。

              对于同一示例的抽象-普通用户可能会说我可以使用任何可以拨打和接听电话的东西。这种抽象可以被任何具体的移动设备代替。查看Abstraction examples。

              【讨论】:

              • 我不太明白你的第一句话是什么意思。听起来您随后将提供不良编程示例来说明封装在哪里有用,但您没有这样做。也许您应该编辑您的回复,或者将最初的句子改写为不同的意思,将其完全从您的回复中删除,或者添加一些在编程中不应该做的例子。
              • 真的吗?我想我在那个例子中做了“不该做的事”。拥有公共速度变量并在不使用访问器方法的情况下直接更改它是不好的做法。
              • 我的评论是在您对答案的第一次修订后留下的,其中您没有列出编程示例。查看编辑的时间戳,您在我发表评论后添加了示例代码。
              • 道歉。忘记了那个。
              【解决方案11】:

              封装有助于坚持单一职责原则,抽象有助于坚持代码到接口而不是实现。

              假设我有一个汽车类:服务提供者类和司机类:服务消费者类。

              对于抽象:我们为 CAR 定义了抽象类,并在其中定义了所有的抽象方法,这些抽象方法是汽车中可用的函数,例如:changeGear()、applyBrake()。

              现在实际的 Car (Concrete Class ie like Mercedes , BMW 将以自己的方式实现这些方法并抽象执行,最终用户仍将为特定的具体汽车实例应用中断和换档,并且多态地执行将按照定义发生在具体类中。

              对于封装:现在说梅赛德斯提出了新功能/技术:防滑制动,在实现 applyBrake() 时,它将将此功能封装在 applyBrake() 方法中,从而提供内聚,服务消费者仍然可以通过汽车对象的相同方法 applyBrake()。 因此,封装可以进一步实现相同的具体类实现。

              【讨论】:

              • (-1) 技术含量过多,与标题中提到的“真实世界”无关
              【解决方案12】:

              抽象 意味着我们专注于某件事的基本品质,而不是一个具体的例子,我们会自动丢弃不重要或不相关的东西。

              示例 我们正在编写一个银行账户类,银行账户的基本素质是开户日期、账户名称、帐号、余额等...

              封装 意味着封装或围绕某些事物的想法,不仅是为了将内容保持在一起,而且也是为了保护和限制表单访问外部。与保密性一起,它是关于减少应用程序不同部分之间的依赖关系。

              示例 在我们的银行账户类中,有人访问了 Balance 的属性并试图改变它,如果没有封装,尝试可以成功。

              【讨论】:

                【解决方案13】:

                将内部细节隐藏到外部世界的抽象,例如你创建一个类(如类中的计算器之一)但最终使用你提供类的对象,在对象的帮助下,他们将播放和执行操作,他做到了'不知道内部使用什么类型的机制。抽象形式的类对象。

                封装是使类中的字段成为私有并通过公共方法提供对字段的访问的技术。如果一个字段被声明为私有,则类外的任何人都无法访问它,从而隐藏了类内的字段。出于这个原因,封装也被称为数据隐藏。例如包含私有方法getAdd,getMultiply的类计算器。

                上面的答案将帮助您理解这个概念。

                【讨论】:

                  【解决方案14】:

                  把抽象想象成隐藏键盘和显示屏幕细节, 封装作为隐藏绑定它们的内部电路。

                  【讨论】:

                    【解决方案15】:

                    如果你见过重要的电视机,电视机的连接线和电视机的彩管都藏在电视机壳里面,像我们这样的观众是不会暴露的,只暴露了电视机的必要的东西,比如电视频道键、电视音量键、开机/OFF 开关、有线电视开关和电视遥控器供观众使用。这意味着电视机、电视连接和电视彩管是不需要的数据,观众不需要看到这些数据被隐藏在外界之外

                    所以封装意味着隐藏类的重要特性,这些特性不需要暴露在类之外,只暴露类的必要内容。 这里类的隐藏部分的行为类似于封装,而类的暴露部分的行为类似于抽象。

                    【讨论】:

                      【解决方案16】:

                      我猜一个蛋壳可以考虑封装和抽象的内容。外壳保护信息。没有壳,你就不能拥有鸡蛋的内容。,,LOL

                      【讨论】:

                      • 您能否通过扩展您的答案来提供一些上下文...如果没有阅读,这是最奇怪的。
                      【解决方案17】:

                      一般来说,抽象就是把复杂的东西隐藏在一个特定的过程后面,使过程看起来很简单。
                      示例:Monitor ON/OFF::--用户不需要知道太多关于Monitor打开或关闭时发生的所有芯片的功能..他只需要知道On Function ON-Monitor 开启并开启功能 OFF-Monitor 关闭...

                      或者更好地寻找一辆车——每个人都知道有一个特殊的齿轮机器可以改变齿轮,没有人会费心知道齿轮改变的所有功能。所以,这就是抽象(避免不必要的实现以防止复杂性)。

                      因此,如果开发人员提供了良好的抽象,用户就不会想窥探对象的内部机制。

                      抽象是通过使具有一个或多个方法抽象的类抽象来实现的。这只不过是扩展它的类应该实现的基本特征。 e.g. 当你发明/设计一辆车时,你定义了一个特征,比如汽车应该有 4 个门、刹车、方向盘等……所以任何使用这个设计的人都应该包括这个特征。实现不是每个抽象的头。它只会定义应该包含的特征。

                      封装是限制用户遵循特定程序来访问特定进程的访问控制。它只是提供安全性并确保系统健壮性。

                      示例:我们可以将公司中的 HR 视为按照 Encapsulation.i.e. 原则工作的人,我们不能直接与其他部门交谈,我们需要通过 HR 进行沟通。这样可以确保公司的安全性和更好的维护记录。

                      我们可以一起举一个UNDER CONSTRUCTION BUILDING..的例子,我们可以说“不”之类的东西。管理人员所需的材料类型、工人数量等在每个建筑施工中都需要抽象。

                      但是,与此同时,将每个此类字段包含在充当工人和建筑投资者之间调解人的承包商中可以被视为封装。 因为,它将上述所有属性隐藏在一个实体中。

                      因此,如果您到现在还能够理解,您可以这样说 抽象只是封装的一个子集。即每个实体 执行抽象是在内部封装的,但每一件事 说明封装不一定总是抽象的。

                      例如.ToString() 几乎每个类中定义的方法都是Abstraction 的实现,因为我们没有内部的功能,我们只关心它将几乎所有内容都更改为字符串。并且当它作为一个单元组装时,它也被封装了..但是,我们通过Properties隐藏和访问的私有成员只是封装的一个例子,因为它基本上是在考虑数据安全的情况下完成的......!!

                      希望这能回答你的问题..!!

                      【讨论】:

                      • 很好的解释。我正在查看一个答案,该答案通过一个示例解释了这两个术语,同时还强调了它们之间的细微差别。这做得非常完美。赞成。谢谢。
                      【解决方案18】:

                      您问题的措辞很奇怪 - 抽象与封装? 应该是——有人解释抽象和封装...

                      抽象就是理解事物的本质。

                      一个现实世界的例子是抽象艺术。这种风格的艺术家试图捕捉/描绘仍然允许它成为事物的事物的本质。这种 4 行的棕色涂片抓住了公牛的本质。

                      封装是黑盒。

                      手机就是一个很好的例子。我不知道手机如何连接到卫星、塔或其他电话。我不知道这该死的东西是如何理解我的按键的,也不知道它是如何拍摄照片并将照片发送到电子邮件地址或其他电话号码的。我不知道现代智能手机的大部分工作原理的复杂细节。但是,我可以使用它!这些手机具有标准界面(是的 - 文字和软件设计),让了解手机基本知识的人几乎可以使用所有这些界面。

                      这两者有什么关系?

                      抽象和封装都是面向对象思想和设计的基础。因此,在我们的手机示例中。智能手机的概念是一种抽象,其中封装了某些功能和服务。 iPhone 和 Galaxy 是更高层次抽象的进一步抽象。您的物理 iPhone 或 Galaxy 是多层抽象的具体示例,其中包含封装的功能和服务。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2017-11-01
                        • 2012-02-16
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-11-29
                        • 2013-02-17
                        • 2013-05-16
                        相关资源
                        最近更新 更多