Сравнение
Между дробями должны быть определены операции алгебраического сравнения, подобные операциям сравнения чисел: ==
, !=
, <
, <=
, >
и >=
.
Равенство экземпляров
Как обсуждалось ранее, методы ==
и !=
позволяют сравнивать экземпляры. Чтобы они работали корректно, необходимо переопределить универсальные методы 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