Сравнение
Между дробями должны быть определены операции алгебраического сравнения, подобные операциям сравнения чисел: ==, !=, <, <=, > и >=.
Равенство экземпляров
Как обсуждалось ранее, методы == и != позволяют сравнивать экземпляры. Чтобы они работали корректно, необходимо переопределить универсальные методы equals и hashCode. Сравнивать экземпляры мы будем по значению поля decimal:
override def equals(obj: Any) = obj match {
case that: Fraction =>
this.decimal == that.decimal
case that: Double =>
this.decimal == that
case _ => false
}
override def hashCode = this.decimal.hashCode
Обратите внимание на сопоставление по шаблону, которое используется в методе equals. В данном случае осуществляется сопоставление по типу, который имеет параметр obj.
Также обратите внимание на метод hashCode: поскольку мы осуществляем сравнение по полю decimal, то именно оно используется для получения hashCode.
Операции сравнения
Осталось реализовать четыре операции сравнения: <, <=, > и >=. Реализуем одну из них, а остальные выразим с помощью нее и операции равенства.
def <(that: Fraction) = this.decimal < that.decimal
def <=(that: Fraction) = (this < that) || (this == that)
def >(that: Fraction) = !(this <= that)
def >=(that: Fraction) = !(this < that)
Проверка
val f1 = new Fraction(8,-6)
val f2 = new Fraction(-5,-3)
f1: Fraction = -8/6
f2: Fraction = -5/3
f1 > f2
res0: Boolean = true
f1 <= f2
res0: Boolean = false
f1 == f1.reduced
res0: Boolean = true