2013-03-02 174 views
22

今天我接受了一次采访。我有一个OOP的问题,关于封装&抽象之间的区别?封装与抽象的区别

我回复了她,据我所知,封装基本上是将数据成员函数绑定到一个名为Class的单​​元中。而抽象基本上隐藏了实现的复杂性,提供了访问用户的简易性。我认为她的答案会很好。但她质疑,如果两者的目的都是为了隐藏信息,那么这两者之间的实际区别是什么?我无法给她任何答案。

在问这个问题之前,我读了关于这两个OOP概念之间差异的StackOverFlow上的其他线程。但我没有找到自己的位置来说服面试官。

任何人都可以请一个最简单的例子证明它?

+4

最后一个公共的方法来访问这些领域,这样 奉献一流水平的封装,是不是每个类得到这份工作? :) – 2013-03-02 15:57:39

+0

@Adrian - nope;) – WpfBee 2013-03-02 17:17:55

+0

@WPFbee不幸! – 2017-04-10 15:13:26

回答

12

包封物隐藏变量或者可以在一个类所以经常更改为防止外人直接访问它的一些执行情况。他们必须通过getter和setter方法访问它。

抽象用于藏着什么东西太多,但在程度较高(类,接口)。客户使用抽象类(或接口)不关心谁或它是什么,他们只需要知道它可以做什么。

+2

完美。在我看来,你的答案只是针对我的面试官问题。我试图用一个实际的例子重新回答你的回答。请让我知道,如果它证明你的答复。让我们以电视为例。封装是将内部电路,LED等结合在一起制成电视机。抽象是开关,声音,频道设置和其他操作按钮。 – WpfBee 2013-03-02 17:54:25

+0

伙计抽象与隐藏实现无关......抽象是一种多态互动类的方法 – Mortalus 2013-03-02 18:22:54

+0

@Mortalus - 我不同意你的第一条语句“抽象与隐藏实现无关”。我认为,当我们开始学习抽象概念时,我们被教导的第一件事就是我们隐藏实现的复杂性并为用户提供一些接口来使用它。因为用户可能对实现的复杂性没有兴趣。你可以举一个电视或AC的实际例子。另一件事是,如果它不隐藏实现,那么为什么我们提供了一个抽象类中没有body的方法。我们显然隐藏了这里的实施。 – WpfBee 2013-03-02 18:36:20

6

抽象: 通常完成以提供对一组类的多态访问。 抽象类不能被实例化,因此另一个类将不得不从它派生来创建更具体的表示。

抽象类的常见用法示例可以是模板方法设计模式的实现,其中引入了抽象注入点,以便具体类可以以自己的“具体”方式实现它。

见:http://en.wikipedia.org/wiki/Abstraction_(computer_science)

封装: 它躲在从将要使用它的客户特定类的实现复杂的过程,请记住,“客户”可以为程序或事件编写课程的人。

看到:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

+1

抽象与抽象类有关? – 2014-02-06 15:07:17

-1

对我来说,封装是将冗长/复杂的过程分解成更小和更有组织的子例程的过程。

function DoEverything() { 
    // do everything 
} 
function Encapsulation() { 
    GetTheLegos(); 
    BuildTheLegoShip(); 
    PretendYouAreAPirate(); 
} 

抽象是找出一组进程的相似性并将这些相似性合并成一个进程的过程。

private void ProcessOne() { 
    try { 
     // code 
    }catch(exception ex) { 
     Utilities.log(ex); 
     Error.Text = "Error!"; 
    } 
} 
private void ProcessTwo() { 
    try { 
     // different code 
    }catch(exception ex) { 
     Utilities.log(ex); 
     Error.Text = "Error!"; 
    } 
} 

然后将其转化为如下所示的内容。

private void HandleException(exception ex) { 
    Utilities.log(ex); 
    Error.Text = "Error!"; 
} 
private void ProcessOne() { 
    try { 
     // code 
    }catch(exception ex) { 
     HandleException(ex); 
    } 
} 
private void ProcessTwo() { 
    try { 
     // code 
    }catch(exception ex) { 
     HandleException(ex); 
    } 
} 
+0

有没有“与我”oop ..封装是它被定义为什么,它是也没有你描述..你描述了重构代码.. – Mortalus 2013-03-02 18:29:08

+0

“一种便于将数据与操作数据的方法(或其他功能)捆绑在一起的语言结构”。从你自己的链接,几乎就是我的例子。甚至基于这个链接,封装没有确切的定义!荒谬。 – 2013-03-04 00:55:41

2

抽象 - 是识别一组对象的共同基本特征的过程(和结果)。 有人可能会说抽象是泛化的过程:所考虑的所有对象都包含在对象的超集中,所有对象都具有给定的属性(但在其他方面不同)。

封装 - 封装数据和函数将这些数据操作成一个单元的过程,以便从外部世界隐藏内部实现。

这是一个与特定编程语言无关的普遍答案(就像问题一样)。所以答案是:抽象和封装没有共同之处。但是它们的实现可能相互关联(比如,在Java中:封装 - 细节隐藏在类中,抽象 - 细节在类或接口中根本不存在)。

2

封装意味着隐藏。封装也称为数据隐藏。您可以将封装看作是封装在内部的胶囊(药片)。封装包装,只是隐藏属性和方法。封装用于将代码和数据隐藏在一个单元中,以保护来自世界各地的数据。类是封装的最好例子。

抽象是指仅向预期用户显示必要的细节。顾名思义,抽象是“任何事物的抽象形式”。我们在编程语言中使用抽象来创建抽象类。抽象类表示类的方法和属性的抽象视图。在这两个

1

区别只是视点
封装字用于隐藏数据,如果我们的目的是为了防止客户端里面查看我们的逻辑

抽象字用于如果我们的目的隐藏数据看是展示我们的客户端视侧视图

外观的手段,让想

BubbleSort(){ 
//code 
swap(x,y); 
} 

这里我们使用掉期在bubbl如果我们在这里用整个代码替换swap(x,y),在单个实例中他/她无法理解我们的逻辑

16

抽象和封装是两个重要的面向对象编程(OOPS)概念。封装和抽象都是相互关联的术语。封装和抽象之间

现实生活的差异

包封物手段隐藏。封装也称为数据隐藏。您可以将封装看作是封装在内部的胶囊(药片)。封装包装,只是隐藏属性和方法。封装用于将代码和数据隐藏在一个单元中,以保护来自世界各地的数据。类是封装的最好例子。

抽象是指仅向预期用户显示必要的细节。顾名思义,抽象是“任何事物的抽象形式”。我们在编程语言中使用抽象来创建抽象类。抽象类表示类的方法和属性的抽象视图。封装和抽象

  1. 抽象之间

    实现差异是使用接口和抽象类,而封装使用private和protected访问修饰符来实现来实现。

  2. OOPS通过阻止程序员以非预期方式访问数据,利用封装来强制执行类型的完整性(即确保数据以适当的方式使用)。通过封装,只有预定的一组功能可以访问数据。与访问限制(公共/私人等)捆绑在一起的数据类型和操作(方法)的总称是一类。

  3. 封装的实施例

    Class Encapsulation 
    { 
        private int marks; 
    
        public int Marks 
        { 
         get { return marks; } 
         set { marks = value;} 
        } 
    } 
    
  4. 抽象

    abstract class Abstraction 
    { 
        public abstract void doAbstraction(); 
    } 
    
    public class AbstractionImpl: Abstraction 
    { 
        public void doAbstraction() 
        { 
         //Implement it 
        } 
    } 
    
+0

爱你如何将这些条款与他们如何实际执行:) – committedandroider 2014-12-07 01:54:09

+3

从这里复制http://stackoverflow.com/a/20687967/5955233 – 2017-03-10 12:49:19

0

的实施例的抽象和封装是两个重要的面向对象编程(OOPS)的概念。封装和抽象都是相互关联的术语。 封装与抽象之间的真实生活差异: 封装意味着隐藏。封装也称为数据隐藏。您可以将封装看作是封装在内部的胶囊(药片)。封装包装,只是隐藏属性和方法。封装用于将代码和数据隐藏在一个单元中,以保护来自世界各地的数据。类是封装的最好例子。

抽象是指仅向预期用户显示必要的细节。顾名思义,抽象是“任何事物的抽象形式”。我们在编程语言中使用抽象来创建抽象类。抽象类表示类的方法和属性的抽象视图。封装和抽象

  1. 抽象之间

    实现差异是使用接口和抽象类,而封装使用private和protected访问修饰符来实现来实现。

  2. OOPS通过阻止程序员以非预期方式访问数据,利用封装来强制执行类型的完整性(即确保数据以适当的方式使用)。通过封装,只有预定的一组功能可以访问数据。与访问限制(公共/私人等)捆绑在一起的数据类型和操作(方法)的总称是一类。 enter image description here

1

抽象:什么是最低限度的功能,和可变应该暴露在我们班出方。 封装:如何实现这个要求,意味着如何实现。

0

抽象通过为您提供更抽象的图片(一种10,000英尺的视图)来隐藏复杂性,而封装隐藏了内部工作,以便您稍后可以更改它。换句话说,抽象隐藏了设计级别的细节,而封装隐藏了实现级别的细节。

例如,当你第一次描述一个物体时,你会用更抽象的术语来说话,例如,一辆可以移动的车辆,你不会告诉车辆如何移动,它是否会通过使用轮胎移动,或者它会飞,还是会出售。它只是移动。这被称为抽象。我们正在谈论一个最重要的事情,它正在移动,而不是专注于诸如在平面,天空或水中移动的细节。

封装是关于实施。其唯一目的是隐藏来自外部世界的物体的内部工作,以便以后可以更改它,而不会影响外部客户。

例如,我们有一个HashMap,它允许您使用put()方法存储对象,并使用get()方法检索对象。 HashMap如何实现此方法(请参见此处)是HashMap的内部细节,客户端只关心将对象存储并返回的对象,它们不关心HashMap是否正在使用数组,它是如何解决冲突,是否它使用链表或二叉树存储在同一个桶物体落地等

1

存在对藏匿在深度抽象,封装和信息之间的差异倒是一个伟大的文章:http://www.tonymarston.co.uk/php-mysql/abstraction.txt

下面是从结论文章:

抽象,信息隐藏和封装是非常不同, 但高度相关的概念。有人可能会说,抽象是一种技术,它可以帮助我们识别哪些具体信息应该是可见的,哪些信息应该隐藏。封装是 用于封装信息的技术,以隐藏应隐藏的内容,并使可见的内容可见。

0

抽象

在Java中,抽象是指隐藏的信息,真实的世界。它建立了党之间的合同,告诉“我们该如何使用这项服务”。

例如,在API开发中,只有服务的抽象信息已经向世界揭示,而不是实际的实现。 java中的接口可以很好地实现这个概念。

接口提供各方,例如生产者和消费者之间的合同。生产者生产货物时不让消费者知道产品的制造方式。但是,通过界面,制作人让所有的消费者知道什么产品可以购买。在抽象的帮助下,生产者可以将产品推销给消费者。

封装:

封装是抽象的一个层次。相同的产品公司尝试屏蔽来自其他生产组的信息。例如,如果一家公司生产葡萄酒和巧克力,封装有助于屏蔽每个产品相互制造的信息。

  1. 如果我有单独的一个用于葡萄酒,另一个用于巧克力,并且如果所有类都在包中声明为默认访问修饰符,我们将为所有类提供封装级封装。
  2. 在一个包,如果我们声明申请(成员场)作为 私人和具有这些领域