2011-01-23 122 views
0

我对封装的概念和实现有问题。封装概念

有人可以解释给我吗?

+0

你有什么问题? – Sarfraz 2011-01-23 08:39:25

+0

你有问题还是只是一个问题? – 2011-01-23 08:39:31

回答

10

一旦你意识到它(可能)来自与胶囊相同的基本词,封装是一个相当简单的概念。

它只是一个信息的遏制。

封装意味着一个类只发布其他人使用它所需要的内容,而不是更多。这被称为信息隐藏,它意味着类可以完全改变其内部,而不会影响他们的任何用户。

换句话说,字典类可以作为一个简单的数组开始生活,并进展到一个二叉树的词汇,甚至可能是某些数据库访问函数,所有这些都不会改变它的接口。

在一个面向对象的世界里,对象拥有数据和操纵数据的方法,这是封装的顶峰。一种方法是确保每个对象知道调用哪些函数来操作其数据,并确保调用正确的函数。

举个例子,下面是我的神话保持整数列表的一类,但奇怪的是Python的,因此希望通俗易懂,语言:

class intlist: 
    private int val[10] 
    private bool used[10] 
    public constructor: 
     for i in 0..9: 
      used[i] = false 

    public function add (int v): 
     for i in 0..9: 
      if not used[i]: 
       used[i] = true 
       val[i] = v 
       return 
     throw intlist-full 

    public function del (int v): 
     for i in 0..9: 
      if used[i] and val[i] == v: 
       used[i] = false 
       return 
     throw intlist-invalid-value 

现在这里公布的信息是构造和两个功能用于添加和删除。

因为一切都封装了,所以我可以随意更改它,而不会破坏使用它的代码。

我可以使数组更长,我可以将它们存储在二叉树中而不是数组中以使其更快。只要发布的API不会改变,我就可以自由地做我想做的事情。实际上,我也可以在不添加其他代码的情况下将其添加到API中,但我无法删除或更改任何依赖的代码。


您应该注意,封装不是面向对象的新东西。通过确保信息隐藏在模块中(通常是源文件或其包含私有头文件的组),它已经存在很久了。

事实上,stdio.hFILE*东西是一个很好的例子。你不需要保护指针后面的内容是什么,因为所有使用它的函数都知道如何去做。

7

link text

我总是它向人们解释是认为自己作为一个对象。其他人可以看到你的身高,他们可以看到你的笑容,但你的内心想法,也许是你笑的原因,只有你知道。

2

封装 - 将数据封装在一个单元中。我们也可以说隐藏了重要细节的信息。 example 你有一部手机......有一些界面可以帮助你与手机进行互动,并且可以使用手机的服务。但实际上在手机上工作是隐藏的。你不知道它在内部是如何工作的。

隐藏/绑定东西:例如:一个胶囊(当我们在病态时使用)在其本身上隐藏/粘结一些粉末形式,意味着胶囊包封了包含它的粉末。

数据和行为的绑定即对象的安全和受控方式的功能。

或封装的最好的例子是一类,因为类隐藏类变量/从外部d类函数..

封装: 结束语数据成员和方法一起成单个单元(即,类)是称为封装。

例如:我们可以考虑一个胶囊。封装意味着隐藏对象的内部细节,即对象如何做某事。这里胶囊是一个单元包含很多东西。但是我们不知道侧胶囊里有什么。

这是用来保护有关对象与其他对象有关的信息的技术。像变量一样,我们可以将其设置为Public和Property。当我们访问该属性时,我们验证并设置它。

我们可以通过一些其他的例子。我们的笔记本我们可以使用笔记本电脑,但是我们不知道内部发生了哪些操作。但我们可以使用它。同样,如移动,电视等

我们可以得出结论,一组相关的属性,方法和其他部件被作为一个单一的单元或object.An封装的对象处理通常被称为抽象数据类型。

还有其他几种方法的封装,可以使用,作为一个例子,我们可以采取一个接口的使用。该接口可用于隐藏已实现类的信息。

//声明为私有

private string _LegName; 

//属性设置为公共

public string LegName 
{ 
    get 
    { 
    return _LegName; 
    } 
    set 
    { 
    _LegName=value; 
    } 

public class LegMain 
{ 
    public static int Main(string[] args) 
    { 
    Leg L= new Leg(); 
    d.LegName="Right Leg"; 
    Console.WriteLine("The Legis :{0}",d.LegName);return 0; 
    } 
    } 

注:封装提供了一种方法,以防止意外损坏的数据。

谢谢

1

封装不仅仅是定义访问和mutator方法一类多。它是面向对象编程的一个更广泛的概念,它包含尽量减少类之间的相互依赖性,它通常通过信息隐藏来实现。

封装美是在不影响用户的情况下改变事物的力量。

在面向对象的编程语言如Java,您可以通过使用访问修饰符(公共的,受保护的,私人的,不加修饰,这意味着包私人)隐藏实现细节封装。通过这些可访问性级别,您可以控制封装级别,限制级别越低,发生更高代价的变化时,该类与其他相关类(即用户类,子类)的耦合程度越高。

因此,我们的目标是不是隐藏数据本身,而是这个数据是如何操作的实施细则。

这个想法是提供一个公共接口,通过它你可以访问这些数据。您稍后可以更改数据的内部表示而不影响该类的公共接口。相反,通过暴露数据本身,您会破坏封装,并因此影响改变操作数据的方式而不影响用户的能力。您使用数据本身创建依赖关系,而不是使用该类的公共接口。当“变化”终于找到你时,你会创造一个完美的鸡尾酒。

有几个原因可能导致您想封装对字段的访问权限。 Joshua Bloch在他的着作Effective Java中,在第14项中:最小化类和成员的可访问性,提到了几个令人信服的理由,我在这里引用:

您可以限制可以存储在字段中的值(即性别必须是F或M)。 您可以在修改该字段时执行操作(触发事件,验证等)。 您可以通过同步方法来提供线程安全性。 您可以切换到新的数据表示形式(即计算字段,不同数据类型) 但是,封装不仅仅是隐藏字段。在Java中,您可以隐藏整个类,从而隐藏整个API的实现细节。例如,在方法Arrays.asList()中考虑一下。它返回一个List实现,但你不关心哪个实现,只要满足List接口,对吧?将来可以更改实现,而不会影响方法的用户。

封装

现在,在我看来的美,真正理解封装,首先必须了解抽象。

想一想,例如,在汽车概念的抽象层面。一辆汽车在其内部实施中是复杂的。他们有几个子系统,如传输系统,休息系统,燃油系统等。

但是,我们已经简化了它的抽象,并且我们通过其抽象的公共接口与世界上所有的汽车进行交互。我们知道所有的汽车都有一个方向盘,通过这个方向盘我们可以控制方向,他们有一个踏板,当你按下它时,你加速汽车并控制速度,另一个当你按下它时,你停下来,你有一个齿轮棒,让你控制,如果你前进或后退。这些特征构成了汽车抽象的公共接口。在早上,您可以开着一辆轿车,然后在下午开车,在下午开一辆SUV,就好像它是一样的。

然而,我们中很少有人知道所有这些功能如何在引擎盖下实现的细节。想想汽车没有液压系统的时间。有一天,汽车制造商发明了它,并决定将其从汽车中放入汽车中。尽管如此,这并没有改变用户与之交互的方式。用户至多在方向系统的使用方面经历了改进。像这样的改变是可能的,因为汽车的内部实施是封装的。更改可以安全地完成,而不会影响其公共界面。

现在,认为汽车制造商决定将燃料盖放在汽车下方,而不是放在汽车的一侧。你去购买这些新车中的一辆,当你用完汽油时,你去加油站,并且你没有找到加油盖。突然间,你意识到车底下,但你不能用气泵软管达到它。现在,我们已经打破了公共接口契约,因此整个世界都崩溃了,因为事情并没有按照预期的方式运行,所以崩溃了。像这样的变化将花费数百万美元。我们需要更换世界上所有的加油泵。当我们打破封装时,我们必须付出代价。

因此,正如您所看到的,封装的目标是最大限度地减少相互依赖并促进更改。您通过最大限度地减少实现细节的暴露来最大化封装。只能通过其公共接口访问类的状态。

我真的建议你阅读由Alan Snyder撰写的一篇名为封装和继承的面向对象编程语言的论文。此链接指向ACM上的原始论文,但我确信您将能够通过Google找到PDF副本。