【问题标题】:Encapsulation concept confusion [duplicate]封装概念混淆[重复]
【发布时间】:2016-05-08 02:34:32
【问题描述】:

很长一段时间以来,我一直试图通过许多链接和 youtube 视频来理解封装和抽象的概念,但仍然对封装的概念有些困惑。

根据我对抽象和封装概念的理解是:

抽象只显示必要的内容

封装说明隐藏复杂性

例如:

如果我们有客户应用程序通过获取数据库连接来添加客户及其相关详细信息,例如地址。

在这种情况下,我对抽象的理解是在我们的类中只显示 addCustomer() 方法,而当调用 add 方法时我们执行的其余操作(如 getDBConnection() 和 addCustomerAddress() 隐藏在其中。

**

public void addCustomerDetails(){
    getDBConnection();
    addCustomer();
    addCustomerAddress();
}

**

所以这里无论谁使用我们的类只需要调用 addCustomerDetails()(ieAbstraction) 并且不必担心如何建立数据库连接以及如何执行这些操作ie(隐藏细节或封装)

到目前为止,一切都很好,但在某处我读到了另一个与封装相关的定义:

数据封装是将数据和函数组合成一个称为类的单元的过程。

这可以通过将数据成员保持为私有和功能公开来实现,这样任何人都无法直接访问它。

请告诉我封装的正确定义是什么以及如何定义?

谢谢。

【问题讨论】:

  • 谢谢,但我已经浏览了您之前提供的链接,但仍然有困惑,所以发布了我的问题
  • 你会发现定义有点模糊,人们用词也不同。您对这些概念有扎实的了解,此时您可能应该继续编码并接受这种缺乏完全清晰的情况。它会一次又一次地发生。
  • 将“许多链接和 youtube 视频”替换为“许多教科书和多年的实践经验”。

标签: java c# c++ oop


【解决方案1】:

以这种方式考虑封装,那么它实际上可以将您的第一个封装定义连接到您的第二个定义。

封装 =“将数据和函数组合成一个称为类的单元”(您的第二个定义)

类中的每个私有数据成员都不能从类外部访问。所以,它被有效地隐藏了。只有类中的方法/函数才能访问它们。从类外部,为了操作类中的私有数据成员,您只能通过调用同一个类中定义的公共方法/函数来实现。

【讨论】:

    【解决方案2】:

    封装的想法最初可以被认为是保护类的字段。

    我通常认为封装是您不提供对类之外的实体(即外部类)的公共访问,如果您愿意,可以使用公共方法(通常是 getter 和 setter)来实现。

    那么我们举个例子:

    private String field1;
    

    该字段只能从该类中的方法访问,不能从其他方法访问;对外部类既没有读也没有写访问权限。

    如果您希望授予读取权限,请为该字段实现一个 getter:

    public String GetField1() { return this.field1 }
    

    现在,这是封装的良好做法,如果您现在想授予写入权限,您将执行以下操作:

    public void SetField1(string value)
    {
       if(some_logic_here}
       {
          // If and only if true, then set
          this.field1 = value
       }
    }
    

    因此,您的类的属性不会获得随机值,而是会通过一些检查,以确保数据有效且适合字段表示的内容。

    所以总结一下封装:

    • 只公开类的必要部分。
    • 对外部实体隐藏类的不必要部分。

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 2019-09-24
      • 2011-04-23
      相关资源
      最近更新 更多