什么是封装?

3
我的老师告诉我,封装是数据/信息隐藏。 但是我从这里了解到的是:封装是将操作数据的方法和数据捆绑成一个单元。而且[封装]允许我们创建信息隐藏机制。例如,使变量只读,或者通过某些检查点访问它。 我理解得对吗?封装本身并不是数据隐藏,而是一种我们可以用来隐藏数据的方式?

是的,隐藏数据只是它可能做到的一部分,而不是主要目的。 - Steve
3
身体隐藏了其营养吸收系统的细节。你不能通过将营养物质注入器官来为自己提供营养。你只有一个摄取营养物质的路径(即口腔)。在这之后发生的事情的细节被很好地隐藏起来。一个设计良好的类应该有一个对消费者有意义的外部接口(比如口腔和排泄废物的机制),以及这个接口背后可能是一套复杂的数据和操作(食管、胃、肠等等)。 - Flydog57
我今天有点懒:https://www.techopedia.com/definition/3787/encapsulation-c - Trey
可能是封装 vs 数据隐藏 - Java的重复问题。 - Jack
封装本身并不一定意味着数据隐藏。我将封装视为不同级别的软件或数据结构,每个级别在很大程度上像相邻级别的黑盒子。信息通常是隐藏在级别之间的,仅因为关于A级别的信息在B级别不需要,并反之亦然(例如,如果执行抽象计算,您只关心结果而不是所有中间步骤),但有时信息被明确隐藏(例如,处理密码等信息时)。 - ImaginaryHuman072889
4个回答

3
很遗憾,没有权威的来源可以完全有信心地告诉你答案。每次涉及到这个问题时,你(我们所有人)都必须问清楚发言者/作者的确切意思。
大多数情况下,“封装”比“信息隐藏”多一点。
“封装”更抽象,可能不仅仅是数据,还包括逻辑或任何知识。
“数据隐藏”只是隐藏数据(实例变量)。
如何实现这些东西是更多争论的来源!例如,有些人(如果不是大多数人)在实例变量仅被声明为“私有”时就会引用“数据隐藏”。即使有相同数据的公共getter方法!(链接的文章似乎支持这种观点)
对于其他人(包括我自己),如果有一个公共的getter方法来获取数据,那么称数据已经隐藏听起来至少很奇怪。
有些人坚持认为getter方法是可以接受的(应用数据隐藏),如果返回的数据是“不可变”的,因为它不能被改变。
“封装”通常与逻辑一起使用。例如:我将如何发送电子邮件封装在这个类中等等。
问题是,每个人都使用相同的词汇,所以几乎不可能确定某个人真正的意思。如果你想知道某人在谈论什么,请始终要求一个(或两个)示例。

1
我将根据《代码大全》中的理解为您解释封装和数据隐藏。
当您创建一个类/方法时,主要目标是减少程序的复杂性。您创建一个类/方法来隐藏信息,以便您不需要考虑它。当然,在编写类/方法时,您需要考虑它。但在编写完成后,您应该能够忘记细节并使用该类/方法,而无需了解其内部工作原理。
因此,每个类/方法都应该问一个问题:“为了减少复杂性,我应该隐藏什么?”因此,您开始创建该类/方法向外界(其他类/方法)提供的接口的抽象表示,并确保详细信息在抽象层面之后保持隐藏。 抽象化通过提供模型来管理复杂性,使您可以忽略实现细节。 封装是执行者,即使您想查看详细信息,也会阻止您查看。如果我将一个方法声明为private,我强制它只能在类内部使用,而不能从外部使用;如果我将其声明为public,则表示它是该类提供的接口的一部分,可以从外部使用。这两个概念是相关的,因为没有封装,抽象化往往会失效。

0

这意味着除非该对象允许,否则您不能干扰其他对象的内部。它被封装在一个你无法进入的胶囊中。这种情况下的一个产物是隐藏信息。如果你被封闭起来,只有你能打开东西,那么你基本上隐藏了自己内部的所有东西。因此,隐藏是封装的结果。


-3
考虑一个生日类,它在构造函数中接受一个出生日期(DateTime)。它有以下填充的属性。
   Public Property _ZodiacSign As String = String.Empty
    Public Property _ChineseZodiac As String = String.Empty
    Public Property _ChineseZodiacChar As String = String.Empty
    Public Property _is21AndOver As Boolean
    Public Property _ChineseDate As String
    Public Property _EstimatesConvievedDate As DateTime

你不知道如何计算星座或生肖,或者他们是否已经超过21岁,这是一个黑匣子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接