就像在 Qt 中一样,我在 QPoint 类中看到了。它使用 QPoint.x() 来获取和使用 QPoint.setX() 来设置。为什么不直接使用 x 作为公共变量?我知道有些书推荐它,但它的深层原因是什么?而且有时不太方便。
问问题
788 次
2 回答
3
这样做有三个基本原因。
- 抽象。您的用户不应该知道或关心
x
是按价值存储还是每次都计算。也许您存储一个盒子的上 x 坐标及其宽度,并计算x
为max_x - width
. 也许您在 3.4 版本中更改了存储数据的方式。 - 一致性。您的用户不必记住在将宽度调用为函数 ( ) 时将其调用
x
为变量 ( )。所以让它变得简单,并将一切(在合理范围内)作为一个函数。myobject.x
myobject.width()
- 控制。也许
x
只允许是积极的,甚至,或者当你改变时x
,upper_x
也需要改变。使用 setter/getter,您可以强制执行所有这些操作。
于 2013-03-27T00:27:47.277 回答
1
创建成员private
并使用 getter 和 setter 访问它的三个常见原因:
您需要对成员保持一些不变性。也就是说,如果成员可以拥有使您的对象无效的某些值,则您要确保客户端不能仅根据自己的意愿对其进行修改。如果您没有不变量, Stroustrup 建议使用 a
struct
。您希望接口以某种不同的形式公开成员。一个例子是,如果您存储 a
Person
,dateOfBirth
但您想通过成员函数公开它getAge()
。年龄是根据出生数据计算的,但您不希望客户dateOfBirth
直接访问。在未来的某个时候,前两点中的一个或两个可能会成为现实。
如果我正在实施 a Point
,我会使其成为 astruct
并拥有x
并y
成为公共成员。根本没有无效的东西Point
,我无法想象坐标将需要从其他表示中计算出来。Qt 开发人员显然做出了不同的决定。
于 2013-03-27T00:25:41.537 回答