3 回答
TA贡献1785条经验 获得超4个赞
使用getter和setter函数可以进行约束和封装。可以说x是半径。shape.x = -10没有太大意义。另外,如果有人尝试设置非法值,则可以打印错误,设置默认值或什么都不做。
优良作法是将成员变量设为私有,这样程序就不能直接使用它们对其进行修改。
TA贡献2037条经验 获得超6个赞
很多人提到封装实现的细节,这对我来说是在类中使用getter和setter的最大原因。这样,您还可以获得许多其他好处,包括能够一时兴起地抛出并替换实现,而无需接触使用类的每段代码。在一个小型项目中,这并不是什么大好处,但是如果您的代码最终成为一个使用良好的(内部或公共)库,那么它将是一个巨大的好处。
一个具体的例子:数学中的复数。有些语言将它们作为一种语言或框架功能,而另一些则没有。我将在这里以可变的类为例,但是它很容易不变。
复数可以写在表单上,a + bi
具有实部和虚部,非常适合[gs]etRealPart
和[gs]etImaginaryPart
。
但是,在某些情况下,更容易推断出极性形式re^(iθ)
为[gs]etRadius
(r)和[gs]etAngle
(θ)的复数。
您还可以公开类似[gs]etComplexNumber(realPart, imaginaryPart)
和的方法[gs]etComplexNumber(radius, angle)
。根据参数类型,这些名称可能需要也可能不需要不同的名称,但是类的使用者可以根据需要使用它们。
两种形式可以互换。您可以很容易地从一种转换为另一种,因此该类用于内部存储的形式与该类的使用者无关。但是,消费者可以使用任何一种形式。如果您选择a + bi形式作为内部表示形式,并使用字段而不是getter和setter公开该形式,则不仅迫使类消费者使用该形式,而且以后也无法轻松地改变主意并用以下形式替换内部表示形式: re ^(iθ),因为事实证明在特定情况下更容易实现。您必须使用已定义的公共API,该API要求使用特定的字段名称专门公开实部和虚部。
添加回答
举报