可能重复:
抽象VS信息隐藏VS封装
我知道这个问题可能已经问上千次在这个论坛上,甚至网还充斥着大量关于这些概念的定义,但一切听起来相同,都采用相同的技术的话。 例如下面的定义
封装是结合或包裹的数据和对数据进行操作成一个实体的代码的处理。 这使得从外部接口和滥用安全数据。 考虑封装的一种方法是作为防止代码和数据从由包装之外定义其他代码被任意访问的保护性包装。
我从上面的定义理解的是,在创建变量,它们标记为私有,并产生消气二传手这些变量和使用对象来访问这些getter和setter。 在这样的数据被隐藏在对象,只能通过对象访问。 希望我是对的 。
抽象是用来隐藏某些细节,只显示对象的基本特征在Java中的过程。 换句话说,它与对象(接口)的外部视图的交易。
现在,这是混淆了我永远的一部分。 每当我想起它的抽象来我想的事情是抽象类(可能是因为都有摘要关键字)。 上述定义说的抽象是指隐藏数据,并只显示必要的细节,但是这是我们已经做在封装吧? 那么有什么区别。 此外,我没有得到什么就在物体的侧视图它与对象的外景交易 。
是否有人可以把更多的光在这一些现实生活中的例子或某些程序的例子,如果可能的。
OO抽象过程中一流水平的设计时,与藏匿 如何通过API /设计/系统提供的功能都实现了实现复杂度 ,在一定意义上简化了“接口”来访问底层实现的目标。
抽象的方法可在类日益“更高”水平(层)被重复,这使得大系统,而无需在每个层增加的代码和理解的复杂性来构建。
例如,Java开发人员可以使用的高层次功能的FileInputStream而不用关心它是如何工作(即文件句柄,文件系统的安全检查,内存分配和缓冲将在内部管理,以及消费者被隐藏)。 这使得实施FileInputStream
改变,并且只要API(接口) FileInputStream
保持一致,内置针对以前版本的代码仍然可以工作。
同样,设计自己的类时,你会想尽可能地从别人隐藏内部实现细节。
在了Booch定义1,OO 封装是通过实现信息隐藏 ,并且具体地围绕隐藏由类实例拥有内部数据(场/表示状态的成员),通过强制执行访问内部数据以受控的方式,并防止直接的,外部改变这些字段,以及隐藏类的任何内部实现方法(例如,通过让他们私有的)。
例如,一个类的字段可以由private
在默认情况下,只有当被要求对这些外部访问,将一个get()
和/或set()
或Property
)从类暴露。 (在现代面向对象的语言,字段可以作为标记readonly
/ final
/ immutable
这进一步限制了变化,甚至内部类)。
示例,其中NO信息隐藏已经应用(不好的做法):
class Foo {
// BAD - NOT Encapsulated - code external to the class can change this field directly
// Class Foo has no control over the range of values which could be set.
public int notEncapsulated;
}
示例,其中场封装已经应用 :
class Bar {
// Improvement - access restricted only to this class
private int encapsulatedPercentageField;
// The state of Bar (and its fields) can now be changed in a controlled manner
public void setEncapsulatedField(int percentageValue) {
if (percentageValue >= 0 && percentageValue <= 100) {
encapsulatedPercentageField = percentageValue;
}
// else throw ... out of range
}
}
一个字段的不可改变/只构造初始化的实施例 :
class Baz {
private final int immutableField;
public void Baz(int onlyValue) {
// ... As above, can also check that onlyValue is valid
immutableField = onlyValue;
}
// Further change of `immutableField` outside of the constructor is NOT permitted, even within the same class
}
回复:抽象VS抽象类
抽象类是促进阶层之间的共性重用类,但它本身不能直接被实例化new()
-抽象类必须被继承,只有concrete
(非抽象)子类可以被实例化。 可能混淆的一个源Abstraction
和abstract class
是,在OO的初期,继承被更重地用来实现代码重用(例如,与相关联的抽象基类)。 如今, 组合物一般优于继承 ,并且有可用来实现抽象更多的工具,如通过接口,事件/代表/功能,特性/混入等。
回复:封装VS信息隐藏
封装的含义似乎随着时间而演变,并且在近年来, encapsulation
可以通常也确定捆绑成一类方法,字段,属性,事件等时使用在更一般的意义。
引用维基百科:
在一个面向对象的编程语言的更多的具体设置中,概念用来表示任一种信息隐藏机构,捆扎机构,或两者的组合。
例如,在语句
我已经封装了数据访问代码到自己的类
.. 封装的解释是大致相当于关注点分离或单一职责委托 (以下简称“S”在固体),并且可以说是被用作用于重构的同义词。
[1] 当你看过Booch的封装猫图片 ,你将永远无法忘记的封装-面向对象分析的P46和设计与应用,第二版
在简单的话:决定实施什么,当你做抽象。 隐藏的东西,你已经实现了,当你做封装。
抽象是有关识别共性和减少你有不同层次的代码与工作特点。
例如,我可能有一个Vehicle
类。 一个Car
会从衍生Vehicle
,如将一Motorbike
。 我可以向每个Vehicle
的车轮数量,乘客等,以及这些信息已经被抽象,并确定从普通Cars
和Motorbikes
。
在我的代码往往只是应付Vehicles
通过常用的方法go()
stop()
等等。当我添加一个新的车辆类型后(例如Scooter
),我的大部分代码将继续无视这一事实,并实行Scooter
独自担心Scooter
的特殊性。