如何在Smalltalk中覆盖相等方法?

时间:2013-12-31 13:42:25

标签: smalltalk gnu-smalltalk

我正在阅读book on Smalltalk,我正在练习关于消失元素的异常我无法解决。

Object subclass: Book [
    | isbn |
    <comment: 'A book class'>

    setIsbn: anIsbn [
        isbn := anIsbn.
    ]

    getIsbn [
        ^isbn.
    ]

    = anotherBook [
        ^self getIsbn = anotherBook getIsbn.
    ]
]

| Library |

Library := Set new: 100.
Library add: (Book new setIsbn: '0-671-2-158-1').
(Library includes: (Book new setIsbn: '0-671-2-158-1')) printNl.

我读过我必须覆盖hash方法,但我不知道该怎么做。如何修改Book课程以避免异常

3 个答案:

答案 0 :(得分:7)

我无法确切地说出你在问什么,但是为了覆盖哈希,你应该像使用=一样,你已经覆盖了它,只是包含了不同的定义。所以你做了类似的事情:

hash [
  "return hash here"
]

如果你问的是什么哈希应该是这样的......好好想一想:相同的对象必须具有相同的哈希值(但是这不需要反过来工作)。所以我建议你做一些像

这样的事情
hash [
  ^ self getIsbn hash
]

还有关于消失的元素。 Set是一个哈希集合。这意味着在将它的元素与您要查找的元素进行比较之前,它会通过哈希选择一个子集。因此,如果您没有覆盖哈希,它可能会选择一个不包含所需元素的子集。

最后我建议你使用一些不同的Smalltalk实现,因为当我开始用学习它时,我的头部受伤了。 Personaly我使用它提供了一个很好的用户界面,让你可以看到你覆盖的内容,允许你调试等等。

答案 1 :(得分:2)

您的代码还有一些Smalltalk惯用问题:

  • Smalltalk中的正常访问者不使用get和set。所以你有isbn: anIsbnisbn
  • 您可能想要创建一个以ISBN为参数的额外构造函数,这样您就不必自己发送new和setter:

    Book>>onIsbn: anIsbn    
    
        ^self new
             isbn: anIsbn;
             yourself
    

答案 2 :(得分:1)

基本规则永远不会覆盖# =而不覆盖#hash