Question

HI,

J'ai une question de coulée vers le bas, je suis un peu rouillé dans ce domaine. J'ai 2 clasess comme ceci:

class A{ int i; String j ; //Getters and setters}
class B extends A{ String k; //getter and setter}

J'ai une méthode comme celui-ci, dans une classe d'aide utilitaire:

public static A converts(C c){}

Où C sont des objets qui sont retireved à partir de la base de données et ensuite converti.

Le problème est que je veux appeler la méthode ci-dessus en passant dans un « C » et revenir B. J'ai donc essayé ceci:

B bClasss = (B) Utility.converts(c);

Ainsi, même si la méthode renvoie ci-dessus A moi avons essayé de downcaster à B, mais je reçois un ClassCastException d'exécution. Est-il vraiment aucun moyen de contourner cela? Dois-je écrire une méthode convertit séparés () qui retourne un type de classe B?

Si je déclare ma classe B comme:

class B { String k; A a;} // So instead of extending A it has-a A, getter and setters also

alors je peux appeler ma méthode existante comme ceci:

b.setA(Utility.converts(c) );

De cette façon, je peux réutiliser la méthode existante, même si la relation se prolonge plus de sens. Que devrais-je faire? Toute aide très appréciée. Merci.

Était-ce utile?

La solution

La distribution à partir du type A type B:

B bClasss = (B) Utility.converts(c);

ne fonctionne pas parce que les objets de type A ne sont pas toutes les méthodes qui pourraient être appelées à partir des références de type B. Que voulez-vous attendre à arriver si vous avez appelé

bClasss.getK();

sur la ligne suivante? L'objet sous-jacent n'a pas k variable membre, cette fonte est pas autorisée.

Vous pouvez utiliser des références du supérieur types dans la hiérarchie de classe pour faire référence à des objets de bas types, mais pas l'inverse.

Sans savoir plus, je pense que la meilleure chose à faire est de mettre en œuvre plusieurs méthodes

A aObj = Utility.convertToA(c);
B bObj = Utility.convertToB(c);

Si B étend A, alors vous devriez toujours bénéficier d'une réutilisation de code dans les constructeurs de vos classes.

Autres conseils

Ce qui est important ici est ce que Utility.converts () en fait le rendement - si elle ne crée pas un nouvel objet B et le retourner, il n'y a pas moyen d'obtenir un B de celui-ci.

(puisque vous obtenez ClassCastException, il ne crée pas B à l'intérieur)

Vous devriez travailler dans le niveau approprié d'abstraction et d'écrire vos signatures de méthode pour faire la même chose. Si l'interface publique / défaut de B est modifié que fortement de A, votre signature de la méthode devrait vraiment être un retour B. Sinon, fossé en essayant de le jeter, affecter le résultat de .converts à une variable de type A, et de la traiter comme un a même si elle est de type vrai est vraiment un B. vous seriez défaisant le point d'abstraire par héritage si vous essayez de downcaster ici.

Sans voir votre code source, je n'ai pas la moindre idée si oui ou non il est logique d'utiliser la composition en lieu et place de l'héritage ici. Le paragraphe ci-dessus suppose ce que vous dites à propos de « étend la relation est plus logique » est vraiment vrai.

Si votre méthode convertit () ne retourne pas vraiment un B, alors il n'y a aucun moyen de le jeter à un B. Puisque vous obtenez un ClassCastException il ne retourne pas clairement B.

Vous pouvez écrire des cours a convertis (C c) qui renvoie un B. Mais une autre approche pourrait être d'écrire un constructeur:

B(A a)

qui crée un B en fonction du contenu de A. Ensuite, vous utilisez convertis pour obtenir un C, et de créer un B de celui-ci.

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