封装vs抽象现实世界的例子
对于封装的例子,我可以想到用户和手机之间的交互。 用户不需要知道手机的内部工作情况,所以称之为抽象。 但是封装适合这个例子呢? 请问有人可以解释一下吗?
封装是达到“信息隐藏”的一种方式,所以,以你为例,你不需要知道手机的内部工作情况 。 你有一个接口来使用设备的行为,而不知道实现的细节。
另一方面, 抽象可以解释为使用相同的接口为不同的对象的能力。 相同接口的不同实现可以存在。 细节被封装隐藏。
抽象 :你永远不会买一个“设备”,但总是买更具体的东西:iPhone,GSII,诺基亚3310 …在这里,iPhone,GSII和N3310是具体的东西,设备是抽象的。
封装 :你有几个设备,他们都有一个USB端口。 你不知道是什么样的印刷电路回来,你只需要知道你可以插入一个USB电缆。
抽象是一个封装允许的概念。 我的例子不是最好的(两块之间没有真正的联系)。
你可以在不使用抽象的情况下进行封装,但是如果你想在你的projets中使用抽象的话,你需要封装。
总而言之,抽象只是隐藏了特定过程背后的复杂事物,使过程看起来简单。
示例: 监视器开/关 :: – 当监视器打开或closures时 ,用户不需要知道所有发生的芯片function。他需要知道的所有function都是开启function开 – 监视器打开并打开functionOFF-Monitorclosures…
或者更好找一辆车 – 每个人都知道有一个特殊的齿轮机器改变齿轮,没有人想知道所有的function经历齿轮改变..所以,这是抽象(避免不必要的实施,以防止复杂性)。
所以,如果一个开发者提供了一个很好的抽象,那么用户就不会想要窥探对象的内部机制。
抽象是通过抽象抽象具有一个或多个方法来实现的。 这只不过是延伸它的阶级应该实施的基本特征。 eg
当你发明/devise一辆汽车时,你定义了一个像汽车这样的特征,应该有4个车门,中断,方向盘等……所以任何使用这种devise的人都应该包含这个特征。 实现不是抽象的头脑。 它只会定义应包含的特征。
封装是限制用户遵循特定的程序来访问特定进程的控制。它只是提供安全性,并确保系统的健壮性。
例如:我们可以把公司里的人力资源视为一个按封装原则工作的人。我们不能直接与其他部门沟通,我们需要通过人力资源部门与他们沟通,这样才能保证公司logging的安全和更好的维护。
在一起,我们可以举一个UNDER CONSTRUCTION BUILDING..
例子UNDER CONSTRUCTION BUILDING..
在那里我们可以说,像“不。 需要的经理人员,材料种类,工人数量等,作为他们在每个build筑施工中需要的抽象。
但与此同时,把每一个这样的领域都纳入一个作为工人与build筑投资者之间的调停者的承包商,可以看作是封装。 因为,它将所有上述属性隐藏到一个实体中。
因此,如果你直到现在才明白,抽象只不过是ENCAPSULATION的一个子集。每一个执行抽象的实体都被封装在内部,但是每一个显示封装的东西都不一定是抽象的。
例如.ToString()
几乎在每个类中定义的方法都是Abstraction
实现,因为我们没有这个function,所有我们关心的是它几乎把所有的东西都改成了string。而且当它作为一个单元组装时,它也被封装起来了。但是,我们通过Properties
隐藏和访问的私有成员仅仅是封装的一个例子,因为它基本上保持了数据的安全性。
希望这会回答你的问题..!
封装是为了隐藏类中的variables或者东西,防止未授权的用户使用。 所以像getter和setter这样的公共方法访问它,其他的类调用这些方法来访问
抽象涉及设施来定义代表可以执行工作,报告和改变其状态的抽象“参与者”的对象,并且与系统中的其他对象“交stream”。
考虑下面的实时示例:
封装 : 作为一名司机,您知道如何通过按下开始button来启动汽车,并且启动操作的内部细节对您是隐藏的。 所以整个启动过程对你来说是隐藏的,否则我们可以判断启动操作是从你封装的。
要么
驱动轮封装了从您转动轮子的过程 。
抽象 :
在提到关于抽象的任何事情之前,我们可以在这里接受三个不同的用户(我称之为实体)
1)你2)当地技工3)专家
你实体:由于你只知道按下一个button启动汽车,所有其他的幕后操作都是从你那里抽象出来的。
当地技工实体:我们当地的技工知道启动汽车的一些实施方法,也就是说他可以打开汽车的发动机罩,检查电池电缆或塞子等等。所以总之,当地机械实体知道汽车的一些实施。
专家实体:由于我们的专家(汽车devise师)技工知道我们的汽车的所有操作,他可以很快修复它。 所以总之,Expert Entity知道汽车的所有实现。
汽车的操作完全是从您那里抽象出来的,部分实施给当地机械实体,并全面实施到专家实体。 所以你是一个只有抽象方法的抽象类,Local Mechanic Entity已经扩展了你(既然他也是一个普通用户),他实现了一些方法,让我们的专家实体扩展Local Mechanic并实现所有的方法 。
我认为这是一个很好的例子。
一切都有很多的属性和行为,所以拿你想要的任何对象电视,手机,汽车,人类或任何东西。
抽象:
- 挑选你真正需要的对象的本质的过程
- 换句话说,从对象中select你需要的属性例子:
一个。 电视 – 声音,视觉效果,电源input,通道input。
湾 移动 – button/触摸屏,电源button,音量button,SIM卡端口。
C。 汽车 – 转向,打破,离合器,加速器,钥匙孔。
d。 人 – 声音,身体,视线,听觉,情绪。
封装:
- 隐藏你不需要的对象的细节的过程
- 换句话说,隐藏从对象中不需要的属性和操作,但对于对象正常工作是必需的。示例:
一个。 电视 – 内部和扬声器,显示器,配电黑白组件,通道机制的连接。
湾 移动 – 如何parsing和处理input,如何按下button开/关或改变音量,如何sim连接到服务提供商。
C。 汽车 – 如何转向转向车,如何中断减速或停车,离合器如何工作,加速器如何提高速度,汽车的钥匙孔如何开/关。
d。 人类 – 声音如何产生,身体内部是什么,眼睛如何工作,听力如何工作,情绪如何产生和影响我们。
抽象你需要的一切,把你不需要的东西全部包装起来;)
你的问题的措辞很奇怪 – 抽象vs封装? 它应该是 – 有人解释抽象和封装…
抽象是理解事物的本质。
一个真实世界的例子是抽象艺术。 这种风格的艺术家试图捕捉/绘制仍然允许它的事物的本质。 这条4条线的棕色涂片捕捉了公牛的本质。
封装是黑拳击。
手机就是一个很好的例子。 我不知道手机如何连接到卫星,塔或其他手机。 我不知道该死的东西是如何理解我的按键,或者如何把图片发送到一个电子邮件地址或另一个电话号码。 我不知道大多数现代智能手机如何工作的复杂细节。 但是,我可以使用它! 手机有标准的接口(是的 – 文字和软件devise),让一个谁了解一个人的基本使用几乎所有的人。
两者如何相关?
抽象和封装都是面向对象思想和devise的基础。 所以,在我们的手机的例子。 智能手机的概念是一个抽象概念,在这个抽象概念中,某些特性和服务被封装在其中。 iPhone和Galaxy是更高级别抽象的进一步抽象。 你的物理iPhone或Galaxy是具有封装function和服务的多层抽象的具体例子。
抽象手段我们关注某些事物的基本特性,而不是一个具体的例子,我们自动抛弃那些不重要或不相关的东西。
示例我们正在撰写一个银行帐户类,银行帐户的基本素质是开放date,帐户标题,帐号,余额等…
封装意味着封装的思想或围绕一些东西,不仅仅是保持内容在一起,而且还保护和限制forms访问方面。保密是减less应用程序的不同部分之间的依赖关系。
示例在我们的银行帐户类中有人访问Balance的属性并尝试更改它,如果没有封装,则尝试可以成功。
封装是隐藏信息。
抽象隐藏了function细节。
封装是通过构造类进行的。 抽象是通过在课堂上创build抽象类或接口来实现的。
在问题中给出的例子中,我们使用类的function,我们不关心设备如何实现。 所以我们可以说电话的细节是从我们这里“抽象出来”的。
封装是隐藏的手机用来实现它做的事情; 抽象是隐藏它如何做到这一点。
封装有助于坚持单一责任原则,抽象有助于坚持代码接口,而不是执行。
假设我有一个Car:Service Provider类和Driver Class:Service Consumer Class的类。
对于抽象:我们为CAR定义抽象类并定义其中的所有抽象方法,它们是汽车中可用的函数,如:changeGear(),applyBrake()。
现在实际的汽车(如梅赛德斯 – 奔驰,宝马这样的具体车型将会以自己的方式实施这些方法,抽象执行,最终用户仍然会为特定的混凝土车辆实例应用换挡和换挡, 。
对于封装:现在说梅赛德斯提出了新的特性/技术:防滑刹车,在实现applyBrake()的时候,它会把这个特性封装在applyBrake()方法中,从而提供内聚性,服务使用者仍然可以通过同样的方法访问applyBrake ()的汽车对象。 因此,封装允许进一步在相同的具体类实现。
我觉得封装可能会更有意义的讨论,当你看到如何在编程中不做。 例如,考虑一下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/
这是无法控制的车速和其他variables。 通过封装,Car类可以完全控制汽车类中的数据variables如何被修改。
任何具有某种行为的具体实体都是封装的例子。 这种行为是通过封装某些东西来隐藏客户端提供的。在移动的情况下,它是信号,芯片,电路,电池等等。
对于同一个例子的抽象 – 普通用户可能会说我可以使用任何可以打电话和接听电话的事物。 这个抽象可以被任何具体的移动设备取代。 查看抽象的例子 。
让我给我2美分的一个现实世界的例子类比接近IT。
比方说,你有一个订阅网站,例如一个WordPress的网站
每个用户都有一个angular色,例如admin,subscriber等等。 许多用户可以是pipe理员,用户等。
所以这里的抽象反映在任何具有pipe理员angular色的用户都可以做一组事情,这与哪个特定用户无关 (这是一个抽象的例子)。
另一方面,用户用户不能访问站点的某些设置,因此应用程序的一些内部被封装为普通用户 (这是一个封装的例子)
正如人们可以看到抽象和封装是相对的概念,它们适用于特定的事情。
可以按照这种推理的路线来解释多性与inheritance 。
例如,超级pipe理员用户可以做所有pipe理员用户可以做的事情,再加上一些。 而且,如果pipe理员angular色得到function更新,超级pipe理员将得到相同的更新。 因此,在这里可以看到一个inheritance的例子,即超级pipe理angular色inheritance了pipe理angular色的所有属性并扩展它们。 请注意 ,对于大部分网站来说,pipe理员可以与超级pipe理员互换(这意味着超级pipe理员用户可以轻松地用来代替pipe理员用户,但是通常情况下并非如此)。
封装被定义为通过访问权限封装来自外部世界的一个或多个细节的过程。 它说明应该给予多less访问特定的细节。 Abstraction和Encapsulation都可以协同工作,因为Abstraction指出哪些细节是可见的,并且Encapsulation提供了对可见细节的访问级别。 即 – 它实现了所需的抽象级别。
例如
谈论我们通常在手机上使用的蓝牙。 当我们打开蓝牙,我可以连接另一个手机,但无法访问其他移动function,如拨号,访问收件箱等。这是因为,蓝牙function给了一定程度的抽象。
另一点是当移动A通过蓝牙连接到移动B时,而移动B已经连接到移动C,则A不能通过B连接C.这是因为可访问性限制。
我猜一个蛋壳可以考虑封装和内容的抽象。 shell保护信息。 你不能有没有壳的蛋的内容
如果您看到重要的电视机,电视机连接线和电视机彩pipe隐藏在电视机机壳内,而这些电视机机壳并没有暴露给像我们这样的观众,而只暴露了电video道键,电视音量键,电源开关等电视机所需的东西,电缆开关和电视遥控器,供观众使用。这意味着电视机,电视机连接和电视机彩pipe是一种不需要的数据,观众看不到的是被外界隐藏起来的
所以封装意味着隐藏一个不需要暴露在类之外的类的重要特征,只暴露出一个类的必要事物。 这里隐藏的类的一部分就像封装一样,暴露的一部分类就像抽象一样。
只要将抽象视为隐藏键盘和显示屏幕的细节, 封装作为隐藏绑定它们的内部电路。
把内部细节隐藏到外部世界的抽象例如你创build一个类(比如类的计算器之一),但是为了最终使用你提供类的对象,在对象的帮助下他们将会玩和执行操作,他不知道什么内部使用的机制types。抽象forms的类的对象。
封装是将类中的字段私有化并通过公共方法提供对字段的访问的技术。 如果一个字段被声明为私有的,那么它就不能被类之外的任何人访问,从而隐藏这个类中的字段。 出于这个原因,封装也被称为数据隐藏。例如包含私有方法getAdd,getMultiply的类计算器。
答案上面的Mybe会帮助你理解这个概念。
抽象化
它用于pipe理面向对象的复杂性。 通过使用这个属性,我们可以为用户提供一个对象的基本特征,而不包括其背景解释。 例如,当给朋友发送消息时,我们只是简单地写下消息,说“hiiii”,然后按“发送”,消息就会传送到目的地(她的朋友)。 在这里我们看到工作中的抽象,即我们不太关心负责发送和接收消息的移动的内部工作
抽象化
我们在日常生活中使用了许多抽象概念。考虑一辆汽车。我们中的大多数人都对汽车的工作方式有一个抽象的看法。我们知道如何与它进行交互,以实现我们想要的目标:我们放气,转一个键,按一些踏板等等。 但是我们不一定明白车内发生了什么事情,所以我们不需要这样做。 数百万人每天都在使用汽车,而不了解他们的工作细节。抽象帮助我们上学或工作!
一个程序可以被devise成一组相互作用的抽象。 在Java中,这些抽象是在类中捕获的。 一个class级的创造者显然必须知道它的界面,正如一辆汽车的司机可以在不知道发动机如何工作的情况下使用该车辆一样。
封装
考虑一个银行系统。银行系统具有诸如账号,账户types,余额等属性。 如果有人试图改变帐户的余额,如果没有封装,尝试可以成功。 因此,封装允许类完全控制其属性。