我正在做一个任务,要求我们为一个矩形定义一个类,并为它配备各种方法,其中两个是getHeight()和getWidth(),除了return this.height;和之外不应该做什么return this.width;.我不明白这一点.如果我想访问width或者height,为什么我不会通过引用this.width而不是this.getWidth()?
Joh*_*ann 10
重点是:将接口与实现分开.
属性getter和setter函数(getWidth()和getHeight())是接口.实际变量this.width和this.height实现.
只有界面对外界很重要,而不是实施.实现应该保持内部(数据封装).
在编写课程的基础知识时,有了setter和getter有时候感觉就像打字练习一样,但是当课程及其界面变得更复杂时,它通常会得到回报.某些IDE(如Eclipse for Java和C++)支持为新数据成员生成样板代码.
对于非常简单的类,分离似乎毫无意义,有时会省略getter和setter并授予直接访问权限.一个例子是一个Point2d有成员x和的班级y.
但是一旦对象变得更复杂,getter和setter就是个好主意.您可以稍后在不更改界面的情况下更改实施.例如,您可以稍后在对象宽度发生变化时通知其他实例.
getter的一个主要应用是实现某些方面的只读接口:在这种情况下,只有一个getter方法,没有setter,数据元素是私有的.这样就可以防止代码使用该类意外更改值.
某些语言支持将类的一部分标记为实现的私有或内部,可以按位置标记,也可以使用特殊关键字标记它们private.
像Python这样的其他语言没有明确支持这种严格的数据封装,但它仍然可以通过为内部数据成员按照约定为前缀或后缀添加前缀来实现(Python中的双下划线或双下划线甚至会在某种程度上破坏名称).
这称为信息隐藏,使用它有多种原因.例如,您通常不希望外部用户访问,this.height或者this.width因为您不希望他或她直接更改它们(可能将它们设置为无效值?).通常,您希望隐藏数据在类中的存储方式,并且只允许通过您自己定义的方法进行访问.
当然,有时你不需要担心这个; final例如,如果您的字段被声明,那么在某些情况下可能会授予直接访问权限.这可以在所有数组中看到,这些数组都有一个public final int字段length.直接访问final字段更合适的原因是知道用户永远不能改变它.
此外,使用getter和setter可以使您的代码在将来更易于维护和更新.例如,如果您想要改变未来报告高度的方式怎么办?即如果低于某个阈值,则报告0.如果人们已经height直接访问该领域,这是不可能的.