【问题标题】:What are the different types of encapsulation?有哪些不同类型的封装?
【发布时间】:2010-09-27 23:22:29
【问题描述】:

有哪些不同类型的封装?

我认为这基本上是指抽象、多态和继承等核心 OO 概念是否正确?

我对封装的理解是它是一种隐藏数据/功能的方法,但我从未真正将多态性或继承视为一种封装形式,尽管我可以看到多态性如何被视为封装,因为它可以隐藏您正在与之交互的对象。

那么,您会说仅此而已,还是我缺少一些核心概念?

edit 我刚刚注意到在 cmets 中有人提到它可能指的是私有/公共方法,也许我对这个问题的思考太多并期待一个比实际更复杂的答案?

【问题讨论】:

标签: oop encapsulation


【解决方案1】:

我想你想太多了。

http://en.wikipedia.org/wiki/Information_hiding

本文摘录:

计算机科学中的信息隐藏原理是将设计决策隐藏在最有可能发生变化的计算机程序中,从而在设计决策发生变化时保护程序的其他部分免受更改。保护包括提供一个稳定的接口,将程序的其余部分与实现隔离开来(最有可能改变的细节)。

一种常见的封装形式是使用属性来隐藏私有数据字段。一种更常见的形式是使用 OO 将软件的复杂性封装到具有角色和职责的良好划分的类中。这是 OO 的关键租户,因为它从单一的程序设计风格转变为更加结构化的风格,这种风格努力隐藏所有不相关的信息,除了与您正在处理的特定任务有关的信息。

【讨论】:

    【解决方案2】:

    我的观点和理解是,封装(封装)一词是为了展示而捕捉事物本质的艺术/科学。事实上,根据定义——封装就是将某些东西打包或封装在另一个容器中。因此,封装一词意味着将您尝试实现的内容的精髓打包成有用的形式,以便在必要时可以重复使用。

    因此,要解释这一点,这意味着将材料打包成一种以后会更有用的形式。

    所以真的...按照你认为合适的方式解释这个。我认为它采用了一堆算法和实用程序,并创建了一个可以在其他项目中用作 API 的类结构。这种封装的代码可以被继承和/或扩展,使其可用于修改目的,而无需改变 API 的基本本质。

    因此,抽象、多态和继承不是封装形式,而是扩展和修改封装代码的形式。

    不同形式的封装意味着对属性、方法、字段和类的修饰符——即公共、私有、静态、虚拟(在 C# 中)。其他一切(即重载、覆盖、阴影)都是对该封装的修改或扩展。

    您可以将修改后的代码视为一种封装,然后可以进一步继承/抽象/扩展,但要扩展的包是封装后的产品。

    【讨论】:

      【解决方案3】:

      封装由国际标准化组织的国际标准定义:“信息技术 – 开放分布式处理”,ISO/IEC 10746, 1998。

      它是根据更原始的定义来定义的:

      实体:任何具体或抽象的感兴趣的事物。

      对象:实体的模型。一个对象以其行为为特征,并且, 双重的,按其状态。

      行为(对象的):具有一组约束的动作集合 什么时候发生。

      接口:对象行为的抽象,由一个 该对象与一组约束的交互的子集 关于它们可能发生的时间。

      封装:对象所包含的信息的属性 只能通过在所支持的接口上的交互访问 对象。

      ISO 没有定义不同类型的封装。

      其他帖子提到了信息隐藏。 ISO 并未明确定义信息隐藏方面的封装,尽管它似乎是隐含的,请参阅“封装理论基础”http://www.edmundkirwan.com/pub/

      编。

      【讨论】:

        【解决方案4】:

        封装不仅仅是信息隐藏。这是它的一个方面。它与模块的接口有关。接口提供了两个非常重要的功能:封装和抽象。

        抽象是指模块的客户端不需要知道的只是接口中的内容。

        和

        封装是指模块的客户端无法了解接口中的内容。

        (Perdita Stevens 的 Using UML 中的两个定义)

        【讨论】:

        • 引用的语句都是隐藏信息的两种形式(在后一种情况下,已经隐藏了信息)
        【解决方案5】:

        既然封装只是指“信息隐藏”,那么我想很多东西都可以归类为封装。然而,我倾向于将封装视为“实现隐藏”,换句话说,它是我用来在我编写的任何内容和我编写的任何客户端之间创建松散耦合的工具。

        因此,我倾向于务实地相信,封装是任何范式或最佳实践,可以让我向任何客户呈现干净、可靠的界面。

        【讨论】:

          【解决方案6】:

          通常,该词的用法与它所说的非常接近。当你包含它时,你封装了一些东西,不要让任何交易松散。考虑它的最好方法是,您将某物放入一个黑匣子中,再也没有人可以看到细节了。该框隐藏了所有内容,在其位置提供了一些其他不相关的界面。

          信息隐藏只是封装的一个方面,因为除了数据之外,您还可以隐藏代码本身的任何细节。封装系统的一部分的目的是从整体中消除那一点复杂性,从而更容易理解单独的细节(双方)。 More?

          保罗。

          【讨论】:

            【解决方案7】:

            “封装的候选定义:

            • 以物理方式将相关操作或事物组合在一起。
            • 状态或数据的GateKeeper。
            • 隐藏实现。”

            来源:Encapsulation Definition

            实现封装有两个部分/方式:

            • 首先,封装是一种将相关数据和行为打包成一个单元的技术,即操作(行为)的物理分组

            例如:-

            class Person {
                String name;
                int age;
            
                void talk() {
                }
            
                void think() {
                }
            
                void work() {
                }
            
                void play() {
                }
            }
            
            • 其次,封装是一种保护数据不被外界滥用的技术,称为“信息隐藏”或“数据隐藏”。

            例如:-

            class Person {
                private String name;
                private int age;
            
                public String getName() {
                    return name;
                }
            
                public String getAge() {
                    return age;
                }
            }
            

            来源:What is Encapsulation in Java - the WHAT, WHY and HOW,剧透作者以Interface为例,不属实。接口用于抽象

            【讨论】:

              猜你喜欢
              • 2017-10-07
              • 1970-01-01
              • 2013-06-23
              • 2012-01-17
              • 2013-09-12
              • 2010-12-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多