Question

Ma méthode prend en entrée un objet. Comment puis-je déterminer le type de, puis le jeter en conséquence?

Ainsi, par exemple: binarySearch( Object o );

Dans la méthode binarySearch, j'ai besoin d'un moyen de déterminer le type (ou classe) de Object o. Puis-je besoin de le jeter avec ce type. comment pourrais-je faire ???

Et plus précisément, o l'objet est un enfant d'une classe de base (EG SalariedEmp est enfant de l'employé), et j'ai besoin plus particulièrement la classe de base.

EDIT: Je me suis dit comment faire ce que je voulais, ce qui devrait vraiment être une question tout à fait différente. Je avais besoin d'utiliser la méthode de .compareTo Comparable pour mettre en place un moyen de comparer deux objets à partir des données privées de ces objets. Tout ce que je devais faire était de mettre en œuvre ma classe comme « Comparable » en utilisant le mot-clé implements. Donc, peu importe quel type d'objets sont comparés dans ma méthode binarySearch, cela fonctionne si elles sont du même type (inconnu) et ont Comparable mis en œuvre. Cela rend ma méthode très binarySearch réutilisable avec tout type de classe comparable.

Alors, en toute équité, je vais accepter la réponse qui couvre la question initiale.

:)

Était-ce utile?

La solution

Deux façons de le faire:

  1. Utilisez l'opérateur instanceof.

  2. Appel getClass() sur l'objet (assurez-vous de vérifier null en premier).

Autres conseils

if (o instanceof SalariedEmp)
    doSomethingWith((SalariedEmp)o);

Vous pouvez utiliser RTTI (Run-Time Type d'identification) en utilisant l'opérateur instanceof ou en appelant .getClass () sur l'instance, mais qui est presque toujours une indication que le type super-que vous utilisez est soit le mauvais super type ou est mal conçu.

Dans votre cas, vous ne devez utiliser l'objet, comme vous le savez déjà que vous avez au moins un employé.

Le paradigme orienté objet est que vous ne demandez pas une instance d'objet ce il est, vous lui demandez de faire quelque chose. Dans ce cas, vous avez le choix entre plusieurs chose que vous voudrez peut-être demander un objet employé à faire. Lequel est le meilleur choix pour vous dépend exactement ce que vous essayez de modèle:

Vous pourriez lui demander si elle est salarié, puis éventuellement le jeter, en ajoutant une méthode virtuelle boolean isSalaried() à la classe de base des employés. La méthode de base retournerait faux, mais un SalariedEmployee emporterait sur cette méthode et return true.

Mais alors qui évite (le probablement plus cher) RTTI, il n'évite pas la distribution. Vous pouvez ajouter une méthode SalariedEmployee asSalariedEmployee (), qui, dans la classe de base serait de retour nul et dans un SalariedEmployee retournerait this. Cela vous donne un « sûr » cast, mais vous avez encore besoin d'un test contre nul.

Ou vous pouvez simplement ajouter une méthode argent getSalary () à l'employé. Maintenant, vous ne devez pas faire de casting, mais vous auriez besoin de décider quel est le salaire d'un employé non salarié est; qui pourrait être nul, zéro, ou NaN (valeur spéciale Pas une valeur numérique).

Si vous avez décidé de retourner null, dans certains cas (par exemple, l'ajout de valeurs) que vous auriez à tester contre zéro, dans d'autres (par exemple, en passant le salaire equals ()) vous auriez pas besoin pour effectuer le test null, comme les instance.equals (nULL) doit retourner faux par le cahier des charges de Object.equals ().

Si vous revenez zéro, vous pouvez ajouter sans tester contre zéro, mais égaux pourrait être un peu bizarre - est-il vraiment vrai que deux travailleurs horaires, chacun d'entre eux reçoivent aucun salaire, ont le même (inexistant) salaire? Cela dépend de ce que vous êtes la modélisation. S'il est vrai, revenir à zéro.

Si ce n'est pas vrai que deux travailleurs horaires ont le même salaire inexistant, retourne une valeur NaN. Ce cas est spécifique Justa du « modèle d'objet nul ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top