3

我搜索了关于封装概念的完整描述,我发现找到的答案有点像拼图,必须放在一起。我发现了这个概念的以下描述:

封装是使类中的字段成为私有并通过公共方法提供对字段的访问的技术。如果一个字段被声明为私有,则类外的任何人都无法访问它,从而隐藏了类内的字段。因此,封装也称为数据隐藏。(源 教程点

一种用于限制对某些对象组件的访问的语言机制 一种语言结构,有助于将数据与对该数据进行操作的方法(或其他功能)捆绑在一起。(来源维基百科)

封装允许对象将其接口与其实现分开。对象的数据和实现代码隐藏在其接口后面。

封装是一种技术。它可能是也可能不是为了帮助抽象,但它肯定是关于信息隐藏和/或组织的。它要求以某种方式对数据和函数进行分组——当然,良好的 OOP 实践要求它们应该按抽象进行分组。但是,还有其他用途仅有助于
可维护性等(源stackoverflow

我认为在过程编程中主要是相同的,这里最好的例子是仅由文件函数创建或修改的 FILE 结构。

我想知道还可以添加什么来获得这个编程概念的完整图像,因为在设计 API 或面试问题时了解它非常有用。

4

3 回答 3

3

你是对的:封装是一种通用技术,可以实现信息隐藏的原理,因此可以在计算机科学的各个部分甚至其他领域中找到。

您已经提到了 FILE 指针。另一个简单的 C 示例是任何需要指向结构的指针而不声明它的 API。接口用户不需要知道这个结构是如何实现的,只有接口实现需要知道。因此,通过将所需的动作,即结构信息的传递,封装到传递指针的动作中来隐藏结构的信息。

另一个例子是网络协议:当请求这个页面时,您的浏览器使用 HTTP,而 HTTP 又使用传输控制协议 TCP。在下面的级别上,只有带有有效负载的 Internet 协议 IP,没有 TCP。在那里,TCP 只是封装在 IP 有效负载中的一些不需要的信息。在下一层,没有 IP,只有 MAC,而 IP 是封装在 MAC 有效负载中的一些不需要的信息。

还有一个可能有点牵强的现实示例:通过邮件发送泰迪熊。您的邮政服务界面需要一个包含地址信息的框。它不会看盒子,也不会看到熊。当收件人收到包裹时,他会打开它并与熊拥抱。现在想象一下,邮政服务是计划给你寄泰迪熊的。这个接口(熊+地址)的可重用性如何?小的。相反,我们应用抽象并创建一个接口(框+地址)。我们通过将我们的泰迪熊放入一个盒子来应用封装,隐藏我们实际发送泰迪熊的信息。可怜的泰迪

于 2013-05-20T08:55:19.857 回答
2

封装就是将您的系统/应用程序拆分为定义明确的高内聚部分。创建函数/过程的简单事实是封装。

OOP 语言通常提供改进/实现封装的方法,例如可见性修饰符(信息隐藏原则)。

封装是 OO 所基于的关键原则之一,因此很多人错误地认为它是 OO 独有的特性。

另一件事,这是错误的:

封装是使类中的字段成为私有并通过公共方法提供对字段的访问的技术。

这就是信息隐藏原则

于 2013-05-20T18:45:09.930 回答
0

我将用一个愚蠢的简单例子来展示它。让我们定义一个圆形类:

public class Circle {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public double getPerimeter() {
        return 2 * radius * Math.PI;
    }
}

注意半径是一个私有字段,不能直接从外部访问。那就是封装。封装允许在其他类已经设计和使用该类之后改变您的想法,而不会破坏这些其他类和客户端:

public class Circle {
    private double diameter;

    public Circle(double radius) {
        this.diameter = radius * 2;
    }

    public double getRadius() {
        return diameter / 2;
    }

    public double getPerimeter() {
        return diameter * Math.PI;
    }
}

对象的状态现在以不同的方式表示。但是由于这种状态被封装到对象中,并且对象的接口(公共方法)没有改变,客户端仍然可以使用对象,就好像什么都没有改变一样。

如果不使用封装,并且半径字段是公共的,则无法通过删除半径并将 is 替换为直径来更改类的实现,因为已经使用该类的每个人都会使用半径字段。

于 2013-05-20T08:29:21.227 回答