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