Вы можете использовать RTTI (идентификацию типа во время выполнения), используя оператор instanceof или вызывая .getClass () для экземпляра, но это почти всегда указывает на то, что используемый вами супертип является либо неправильным супер-типа или плохо спроектирован.
В вашем случае вам не нужно использовать Object, поскольку вы уже знаете, что у вас есть хотя бы сотрудник.
Парадигма объектно-ориентированногов том, что вы не спрашиваете экземпляр объекта что это такое , вы просите его что-то сделать.В этом случае у вас есть выбор из нескольких вещей, которые вы можете попросить сделать объект Employee.Какой из них является лучшим для вас, зависит от того, что именно вы пытаетесь смоделировать:
Вы можете спросить его, если он оплачивается, а затем, возможно, разыграть его, добавив виртуальный метод boolean isSalaried()
кБазовый класс сотрудников.Базовый метод вернул бы false, но SalariedEmployee переопределил бы этот метод и возвратил бы true.
Но хотя это позволяет избежать (вероятно, более дорогой) RTTI, оно не избегает приведения.Вы можете добавить метод SalariedEmployee asSalariedEmployee (), который в базовом классе будет возвращать значение null, а в SalariedEmployee - this
.Это дает вам «безопасное» приведение, но вам все равно нужен тест на нулевое значение.
Или вы можете просто добавить метод Money getSalary () для Employee.Теперь вам не нужно выполнять кастинг, но вам нужно решить, какова зарплата неоплачиваемого сотрудника;это может быть ноль, ноль или NaN (специальное значение «Не число»).
Если вы решили вернуть ноль, в некоторых случаях (например, при добавлении значений) вам придется проверить на нуль, вдругие (например, передавая зарплату .equals ()) вам не нужно проверять на ноль, так как любой instance.equals (null) должен возвращать false в соответствии со спецификацией для Object.equals ().
Если вы вернете ноль, вы можете добавить без проверки на ноль, но равно может быть немного странным - правда ли, что два почасовых работника, каждый из которых не получает зарплату, имеют одинаковую (несуществующую) зарплату?Это зависит от того, что вы моделируете.Если это правда, вернуть ноль.
Если это не так, что два почасовых работника имеют одинаковую несуществующую зарплату, вернуть значение NaN.Это конкретный случай «шаблона нулевого объекта».