我正在做一个任务,要求我们为一个矩形定义一个类并为其配备各种方法,其中两个是getHeight()
and ,除了andgetWidth()
之外不应该做任何事情。我不明白重点。如果我想访问or ,我为什么不通过引用而不是来做到这一点?return this.height;
return this.width;
width
height
this.width
this.getWidth()
3 回答
要点是:将接口与实现分离。
属性 getter 和 setter 函数 (getWidth()
和getHeight()
) 是接口。实际变量this.width
和this.height
是实现。
只有接口对外界很重要,而不是实现。实现应该保持在内部(数据封装)。
在编写类的基本原理时,使用 setter 和 getter 有时感觉像是一种打字练习,但当类及其接口变得更加复杂时,它通常会得到回报。Eclipse for Java 和 C++ 等一些 IDE 支持为新数据成员生成样板代码。
对于非常简单的类,分离似乎毫无意义,有时会省略 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
如果人们已经直接访问该字段,这是不可能的。
围绕这一点的基本原则是实现和使用类(由类接口定义)之间的分离。如果您强制类用户通过“setter”和“getter”方法访问类属性,您稍后将能够更改这些属性的实现方式,而无需更改接口。例如,属性可以计算而不是存储,或者它们可以存储在数据库中而不是内存变量等,并且类的用户不需要知道或关心。