首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未封装意味着不可改变?

未封装意味着不可改变?
EN

Stack Overflow用户
提问于 2011-07-02 08:09:07
回答 4查看 423关注 0票数 4

我在有效的C++中越过了这条线

公共意味着未封装,实际上,非封装意味着不可更改,特别是对于被广泛使用的类来说,它们最需要封装,因为它们最能受益于用更好的实现替换一个实现的能力。

什么是作者所说的“公共手段未封装,实际上,未封装意味着不可改变”?

如何使不可封装不可改变?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-02 08:25:15

总的想法很简单。如果你把某件事公之于众,那么有人可以而且很可能会利用它。因此,如果您更改了一些公共的内容,那么使用它的所有代码都会立即中断。破坏人们的代码是不好的;它往往导致他们不想再使用你的代码,因为现在你强迫他们重写他们所有的东西仅仅因为你想使用不同的类型或什么的。

公共接口是类的实现与它的用户之间的契约。更改合同,特别是在没有事先通知的情况下,被认为是非常粗鲁的。

如果您的所有代码都是内部代码,那很好。但是如果不是这样的话,如果您正在创建一个供其他人使用的库(无论是在本地使用,还是只是出售一个库),那么人们对接口更改就不太可能感到高兴了。

这不是C++规则的问题,它只是接口设计规则的问题。由于公共事物是接口的一部分,所以您必须小心您公开的内容。

票数 7
EN

Stack Overflow用户

发布于 2011-07-02 08:30:36

封装是指您只能通过接口方法访问类的数据成员。使用方法的效果是“隐藏”数据成员的实际实现,这样您就可以更改它,而无需通过接口方法更改使用该类的代码(前提是不更改它们的定义方式)。

另一方面,如果您不使用接口方法来隐藏数据成员实现,那么使用它的所有代码都需要在数据成员的任何更改之前进行修改。

假设您有一个包含名称列表的字符串向量的类。如果您公开了该向量,那么所有其他类都可以决定直接使用它,并访问它在向量中的索引包含的字符串(例如,索引充当标识字符串的键)。

稍后,您可以决定需要一个映射来管理所有这些字符串(您的需求已经更改)。您将数据成员定义更改为映射,您的代码将不再编译。这就是“几乎不变”的意思。

通过封装来管理此操作的“正确”方法是将数据成员设置为私有并定义如下的接口方法:

代码语言:javascript
复制
std::string getStringWithKey(int index);

该方法将在第一个实现中访问向量,在第二个实现中访问映射。所有这些都是透明的:使用该方法的代码(而不是直接访问数据成员)将不需要被修改,因此您几乎可以免费地更改数据成员实现。

这是一种过度简化,因为接口的设计并不简单,接口也会发生变化,但我希望它有助于澄清问题。

票数 3
EN

Stack Overflow用户

发布于 2011-07-02 08:20:45

我想最好的答案应该是作者给的。我猜他的意思是,如果您声明一个公共成员并在代码中的许多其他地方使用它,那么如果您稍后决定更改该成员,那么更改所有这些位置将是一项艰巨的工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6555866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档