edit: я только что понял, что число имеет doubleValue()
в качестве абстрактного метода в классе Number. Хорошо, это прекрасно. Просто внедрите равенства во всех пяти классах, как это. В качестве альтернативы, если Number не требуется в качестве абстрактного класса, прочитайте ниже, чтобы увидеть, что вы можете создать свой собственный абстрактный класс, реализующий equals()
, и сохранить дублированный код.
public boolean equals(Object x)
{
if(x instanceof Number == false)
return false;
Number other = (Number) x;
return other.doubleValue() == doubleValue();
}
Причина, по которой вы не можете делать то, что делаете в своих равных, заключается в том, что вы разыгрываете то, с чем пытаетесь сравнить, с классом RationalN. Когда это делается для класса, который не является RationalN, это приводит к исключению ClassCastException.
Поскольку все классы расширяют Number и doubleValue()
объявляется как метод, доступный для Number, теперь вы можете преобразовать эти классы в Number (если они являются экземпляром Number) и затем получить доступ к методу оттуда.
Надеюсь, это имеет смысл. Я рекомендую вам прочитать об интерфейсах и полиморфизме.
edit: Кроме того, если вам не требуется расширять Number, вы можете создать абстрактный класс, который имеет абстрактный метод doubleValue()
, и затем вы можете предоставить конкретную реализацию equals (которую я предоставил выше) в абстрактный класс. Затем пусть все пять ваших классов расширяют абстрактный класс. Каждый из них затем реализует свою собственную версию doubleValue()
, но разделяет equals()
, определенный в вашем абстрактном классе, и, таким образом, исключает копирование / вставку equals()
во все пять классов. Это был бы идеальный маршрут, если бы вам не нужно было расширять номер.