【问题标题】:What is the point of getAttribute() methodsgetAttribute() 方法的意义是什么
【发布时间】:2013-07-01 20:01:13
【问题描述】:

我正在做一个任务,要求我们为一个矩形定义一个类并为其配备各种方法,其中两个是 getHeight()getWidth(),它们除了 @987654328 之外不应该做任何事情@ 和 return this.width;。我不明白重点。如果我想访问widthheight,为什么不直接引用this.width 而不是this.getWidth()

【问题讨论】:

标签: oop


【解决方案1】:

重点是:将接口与实现分离。

属性getter和setter函数(getWidth()getHeight())是接口。实际变量this.widththis.height 是实现。

只有接口对外部世界很重要,而不是实现。实现应该保持在内部(数据封装)。

在编写基本类时,使用 setter 和 getter 有时感觉像是一种打字练习,但当类及其接口变得更复杂时,它通常会得到回报。 Eclipse for Java 和 C++ 等一些 IDE 支持为新数据成员生成样板代码。

对于非常简单的类,这种分离似乎毫无意义,有时会省略 getter 和 setter 并授予直接访问权限。一个示例是 Point2d 类,其成员为 xy

但是一旦对象变得更复杂,getter 和 setter 就是一个好主意。您可以稍后更改实现而不更改接口。例如,您可以稍后在对象的宽度发生变化时通知其他实例。

getter 的一个主要应用是在某些方面实现只读接口:在这种情况下,只有一个 getter 方法,没有 setter,并且数据元素是私有的。这样可以防止使用类的代码意外更改值。

某些语言支持将类的某些部分标记为私有实现内部,可以按位置或使用特殊关键字(如private)标记它们。 p>

像 Python 等其他语言并没有明确支持这种严格的数据封装,但仍然可以通过在内部数据成员上按约定前缀或后缀来实现(Python 中的双下划线或单下划线,双下划线甚至会在某种程度上破坏名称)。

【讨论】:

  • “例如,您可以稍后在对象宽度发生变化时通知其他实例。”为此 +1!
【解决方案2】:

这称为information hiding,使用它的原因有很多。例如,您通常不想让外部用户访问this.heightthis.width,因为您不希望他或她直接更改它们(也许将它们设置为无效值?)。通常,您希望隐藏数据在类中的存储方式,并且只允许通过您自己定义的方法进行访问。

当然,有时您不必担心这一点;例如,如果您的字段被声明为final,那么在某些情况下可能可以授予直接访问权限。这可以在所有数组中看到,这些数组有一个名为lengthpublic final int 字段。让直接访问 final 字段更合适的原因是知道用户永远无法更改它。

此外,getter 和 setter 的使用使您的代码在未来更易于维护和更新。例如,如果您想更改将来报告高度的方式怎么办?即如果低于某个阈值,则报告 0。如果人们已经直接访问 height 字段,这是不可能的。

【讨论】:

    【解决方案3】:

    围绕这一点的基本原则是实现和使用类(由类接口定义)之间的分离。如果您强制类用户通过“setter”和“getter”方法访问类属性,您稍后将能够更改这些属性的实现方式,而无需更改接口。例如,属性可能是计算而不是存储,也可能是存储在数据库中而不是内存变量等,类的用户不需要知道或关心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2023-03-21
      • 1970-01-01
      • 2011-04-19
      • 2013-03-29
      • 2013-01-30
      相关资源
      最近更新 更多