日历

September 2020
M T W T F S S
 123456
78910111213
14151617181920
21222324252627
282930  

实现继承问题的经典实例

Home Forums 《冒号课堂》讨论区 实现继承问题的经典实例

Tagged: ,

  • This topic is empty.
Viewing 4 reply threads
  • Author
    Posts
    • #1132
      Todd
      Member

      “You must override hashCode() in every class that overrides equals(). Failure to do so will result in a violation of the general contract for Object.hashCode(), which will prevent your class from functioning properly in conjunction with all hash-based collections, including HashMap, HashSet, and Hashtable.”

      — from Effective Java, by Joshua Bloch

      《冒号课堂》中提到了实现继承的诸多问题,必须引起重视,解决的方法其中之一便是将这类实现相关的“潜规则”明确写入文档。我觉得最经典的实例就是Java中覆盖equals()方法必须同时覆盖hashCode()的问题。

    • #1346
      hui
      Keymaster

      是的。大部分类的接口规范是独立的,但也有一些接口是互相关联的,你提到的equals与hashCode就是一例。此外,有些接口的实现不仅对public方法有要求,还可能对private方法有要求。比如Java中一个类如果是Serializable类型,并且希望定制序列化过程,则需要实现私有的writeObject和readObject方法。

    • #1347
      Lumj
      Member

      最近在使用js独自开发一个HTML UI库的时候,才开始有感于实现继承对于子类提出的潜要求的普遍存在性

      工程规模还不十分大,所见到的最常见的”潜要求”就是,子类实现某方法时必须在开头或结尾调用基类的某方法

      两位提到的情形我能想象,只是没见过,不知在现实中我上面所说的这类潜要求和两位提到的潜要求是否占了这类潜要求的一大块份额?

    • #1348
      hui
      Keymaster

      以上提到了实现继承的三种常见pitfall:继承(或实现)一个父类方法时可能会影响另外的超类方法;实现某些接口时可能对非public方法有特殊要求;子类在覆盖父类方法时可能需要调用某些特别的方法(最常见的是父类的被覆盖方法)。此外还有其他可能,比如《冒号课堂》p269提到的某些方法的实现细节不得不出现在规范文档中,容易被人忽略;再比如,有些子类并未实现某接口的全部方法,如有些Java类的方法只是简单地throw UnsupportedOperationException(严格说来这是不满足里氏代换原则的)。

    • #1349
      Lumj
      Member

      嗯..

Viewing 4 reply threads
  • You must be logged in to reply to this topic.
 请您评分1星(很差)2星(不行)3星(一般)4星(不错)5星(很棒)