Wpf*_*Bee 57 oop encapsulation abstraction
我今天接受了采访.我有一个来自OOP的问题,关于Encapsulation&Abstraction之间的区别?
我回答她的知识,Encapsulation基本上是将数据成员和成员函数绑定到一个名为Class的单元中.而抽象基本上是为了隐藏实现的复杂性并提供对用户的轻松访问.我觉得她的回答会很好.但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我不能给她任何答案.
在提出这个问题之前,我在StackOverFlow上阅读了关于这两个OOP概念之间差异的其他线程.但我并没有发现自己有能力说服采访者.
任何人都可以用最简单的例子来证明它的合理性吗?
phn*_*kha 51
封装隐藏变量或某些可能在类中经常更改的实现,以防止外人直接访问它.他们必须通过getter和setter方法访问它.
抽象也用于隐藏某些东西,但程度更高(类,接口).客户端使用抽象类(或接口)并不关心它是谁或它是什么,他们只需知道它可以做什么.
TT_*_*TT_ 10
抽象 - 是识别一组对象的共同基本特征的过程(以及该过程的结果).有人可能会说抽象是一般化的过程:所有正在考虑的对象都包含在对象的超集中,所有这些对象都具有给定的属性(但在其他方面是不同的).
封装 - 将操作此数据的数据和函数封装到一个单元中的过程,以便隐藏内部实现与外部世界.
这是一个与特定编程语言无关的一般答案(就像问题一样).所以答案是:抽象和封装没有任何共同之处.但是它们的实现可能彼此相关(例如,在Java中:封装 - 细节隐藏在类中,抽象 - 细节在类或接口中根本不存在).
抽象: 通常用于提供对一组类的多态访问.抽象类无法实例化,因此另一个类必须从中派生以创建更具体的表示.
抽象类的常见用法示例可以是模板方法设计模式的实现,其中引入抽象注入点,以便具体类可以以其自己的"具体"方式实现它.
请参阅:http://en.wikipedia.org/wiki/Abstraction_ (computer_science)
封装: 这是从将要使用它的客户端隐藏特定类的实现复杂性的过程,请记住"客户端"可能是编写类的人的程序或事件.
请参阅:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
封装:将代码和数据包装到一个单元中。Class
是封装的一个示例,因为它包装了方法和属性。
抽象:隐藏内部细节并仅显示功能。抽象专注于对象的功能,而不是对象的功能。它提供了类的通用视图。
int number = 5;
string aStringNumber = number.ToString();
Run Code Online (Sandbox Code Playgroud)
在这里,ToString()是抽象的。这种机制number
变量如何转换为字符串并初始化为aStringNumber
封装。
让我们以计算器为例。封装是内部电路,电池等的组合,使其成为计算器。抽象是指提供的不同按钮(如开关,清除和其他按钮)来进行操作。
有一篇很棒的文章深入探讨了抽象、封装和信息隐藏之间的差异:http : //www.tonymarston.co.uk/php-mysql/abstraction.txt
以下是文章的结论:
抽象、信息隐藏和封装是非常不同但又高度相关的概念。有人可能会争辩说,抽象是一种技术,可以帮助我们确定哪些特定信息应该可见,哪些信息应该隐藏。封装是一种封装信息的技术,以隐藏应该隐藏的内容,并使打算可见的内容可见。
是的 !!!!如果我说封装是一种高级的特定范围抽象,
你们中有多少人阅读/赞成我的回答。让我们深入研究我为什么这么说。
在我提出索赔之前,我需要澄清两件事。
一个是数据隐藏,另一个是抽象
我说,“封装是一种高级的特定范围抽象”。为什么?因为我们可以将封装视为数据隐藏 + 抽象
封装=数据隐藏+抽象
在封装中,我们需要隐藏数据,让外界无法看到数据,我们需要提供可以用来访问数据的方法。这些方法可能在这些东西内部具有验证或其他功能,也对外部人员隐藏。所以在这里,我们隐藏了访问方法的实现,它被称为抽象。
这就是为什么我上面说封装是一种抽象。
那么区别在哪里呢?
不同之处在于,如果我们为了简单性、可维护性和安全性而对用户隐藏某些东西,则抽象是通用的,并且,
封装是一种与内部状态安全相关的特定封装,其中我们隐藏内部状态(数据隐藏),我们提供访问数据的方法,而这些方法的实现也对外部人员隐藏(抽象)。
为什么我们需要抽象 当你做设计时,你不会谈论实现。你说如果你给这个方法提供这些参数,它会给出这些输出。我们隐藏了该方法的内部实现并谈论它将做什么,因此这是一个抽象。
例子
public int add(int a, int b);
Run Code Online (Sandbox Code Playgroud)
这个方法定义告诉我们,如果你给两个变量,它会做加法并返回结果。
在这里我们不会看实现,我们只知道这个方法做了什么,而不是它是如何做的。方法实现可能因开发人员而异。1.
public int add(int a, int b){
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
public int add(int a, int b){
return b + a;
}
Run Code Online (Sandbox Code Playgroud)
两种方法在做同样的事情,但它们的实现不同。
基本上,需要抽象来对系统进行建模。需要封装以增强系统安全性。
小智 5
一个非常实际的例子是。
假设我想加密我的密码。
我不想知道细节,我只是调用 cryptoImpl.encrypt(password) 它会返回一个加密的密码。
public interface Encryption{ public String encrypt(String password); }
这就是所谓的抽象。它只是显示应该做什么。
现在让我们假设我们有两种类型的加密 Md5 和 RSA,它们从第三方加密 jar 实现加密。
然后这些加密类有自己的加密实现方式,可以保护其实现免受外部人员的影响
这称为封装。隐藏了应该如何完成。
请记住:应该做什么与应该如何做。
隐藏复杂性与保护实现