Определить тип объекта, затем наложить его соответственно? - PullRequest
0 голосов
/ 08 декабря 2010

Мой метод принимает в качестве входных данных объект. Как мне определить его тип, а затем разыграть его соответственно?

Так, например: binarySearch( Object o );

Внутри метода binarySearch мне нужен способ определения типа (или класса) объекта o. Тогда мне нужно разыграть его с этим типом. как бы я это сделал ???

А точнее, Object o является дочерним по отношению к базовому классу (EG SalariedEmp является дочерним по отношению к Employee), и мне особенно нужен базовый класс.

EDIT: Я понял, как сделать то, что я хотел, что на самом деле должно быть совершенно другим вопросом. Мне нужно было использовать метод .compareTo из Comparable, чтобы настроить способ сравнения двух объектов на основе личных данных этих объектов. Все, что мне нужно было сделать, это реализовать свой класс как «Comparable», используя ключевое слово implements. Поэтому независимо от того, какой тип объектов сравнивается в моем методе binarySearch, он работает, если они одного и того же (неизвестного) типа и имеют Comparable. Это делает мой метод binarySearch очень пригодным для повторного использования с любым типом сопоставимого класса.

Итак, по справедливости, я приму ответ, который охватывает исходный вопрос.

:)

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010

Два способа сделать это:

  1. Используйте оператор instanceof.

  2. Вызовите getClass() на объекте (убедитесь, что сначала проверили наличие нуля).

3 голосов
/ 08 декабря 2010

Вы можете использовать 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.Это конкретный случай «шаблона нулевого объекта».

3 голосов
/ 08 декабря 2010
if (o instanceof SalariedEmp)
    doSomethingWith((SalariedEmp)o);
...