Je sais que le casting ne peut vraiment être fait que sur une sous-classe à une superbe classe (casting), mais cet exemple illustre ce que j'aimerais faire. Je crois que c'est appelé "Down" Casting qui n'est pas autorisé, donc ... p> Quel est le meilleur moyen de créer un objet de type sous donné un objet de type super. P> EDIT: P> C'est la question - quelle est la meilleure façon de convertir un animal à un chat. P> la réponse? Commencez avec un animal de base animal et copiez les attributs sur le chat. Ajoutez de la fourrure et une queue, etc. Fondamentalement un constructeur de copie. Est-ce la bonne réponse (ou une bonne réponse)? P> Une autre modification: p> Je pense que ma question est assez claire mais elle est peut-être trop générale. Demander le «meilleur» moyen de faire quelque chose a tendance à donner beaucoup de réponses variables. Je réalise que la meilleure façon peut être différente dans des circonstances différentes. P> Je ne cherche pas de tutoriel sur les bases Java ou OO. Je viens de pêcher des opinions afin que je puisse résoudre ce problème comme je l'ai décrit en utilisant les meilleures pratiques. P> p>
5 Réponses :
Edit: De votre question, ce n'est pas du tout clair ce que vous savez et ce que vous ne savez pas. Alors ne soyez pas surpris quand les gens répondent à la p>
Je crois que cela est appelé casting "bas" qui n'est pas autorisé p> blockQuote>
partie et non la question (très vague) "" réelle ". p>
Oui, copier constructeur est le chemin. p>
Non, ce n'est pas le seul, la méthode d'usine fera très bien. p>
Non, ce n'est pas le meilleur - nous n'avons aucune idée des contraintes et des hypothèses que vous avez. p>
Version ancienne: La coulée peut être faite dans les deux sens, l'émertissement étant généralement inutile (sauf si vous devez sélectionner une méthode surchargée spécifique). P>
Il n'y a généralement aucun moyen de créer un objet de type SUB donné un objet de type Super em> autre que de créer une méthode qui construirait un nouvel objet basant sur les données de la données. P >
Pour lancer, vous devez être sûr que l'objet que vous casting est en fait du type que vous munissez vers (ou son sous-type). P>
Je précisais spécifiquement que je sais que la coulée est autorisée et je sais que la coulée n'est pas. Je finis en demandant quelle est la meilleure façon de faire x compte tenu de ces informations. Je suis un peu rhétorique en ce moment - comment suis-je pas clair?
@Matthew bien, Downcasting est I> autorisé. Il n'est pas clair si vous savez ce que «Downcasting» est, car il est effectivement autorisé, c'est donc le problème habituel «qui contre lequel» ou un manque de compréhension. Basing sur l'expérience précédente, beaucoup assument le manque de compréhension.
Je suppose que je pourrais dire "Je sais que la coulée n'est pas autorisée" ... "dans cette situation particulière."
@Matthew qui ferait des choses plus faciles, vraies. Ainsi que "je crois que ça s'appelle" -Nindirection signifie généralement un manque de confiance, alors tout le monde était impatient de vous dire ce que la rédaction était :)
Vous ne pouvez plus que le refuge si l'objet réel est du type "SUB". Par exemple:
Super subAsSuper = new Sub(); Sub sub = (Sub)subAsSuper
Vous pouvez ajouter un constructeur à la classe code> sous code> qui prend un objet super code> comme paramètre. p>
A Si je vous donne un animal (ne doit pas être chat), comment le convertiriez-vous à un chat? p>
EDIT: P>
Il y a un moyen de faire presque n'importe quoi. La plupart du temps, vous ne devriez pas. Je crois qu'un meilleur design éliminerait la nécessité de sous-traiter. Mais vous pouvez: p>
avoir un constructeur dans implémente une usine de Je vous suggère de développer votre question, dis-nous exactement ce dont vous avez besoin, car je pense vraiment qu'une solution plus élégante existe. P> CAT code> est un animal code>. p>
super code> qui prend un sous code> comme paramètre. p> li>
Super code> et avoir une méthode qui prend un sous code> comme paramètre. p> li>
ul>
@Matthew - juste parce qu'il y a un moyen de le faire, cela ne veut pas dire que vous devriez. Vous seriez mieux statique ce que vous voulez réaliser. Downcasting est rarement la réponse et je suis sûr de 99% une meilleure solution existe dans votre cas.
Merci d'avoir répondu. Je peux faire des recherches et trouver exactement ce dont j'avais besoin d'autre dans ce cas et faire une question plus détaillée et plus précise. Cela fera certainement ce dont j'ai besoin pour le moment où je voulais juste demander une réponse générale, mais je sais que je vais courir dans une situation où j'ai besoin de quelque chose de plus spécifique plus tard.
Prenez cette idée à l'esprit -
Class Super {}
Class Sub {
public Super super = new Super();
}
Sub sub = new Sub();
sub.super = super;
De votre question, ce n'est pas du tout clair ce que vous savez et ce que vous ne savez pas. Donc, ne soyez pas surpris lorsque les gens répondent à Je crois que cela est appelé casting «Down» qui n'est pas autorisé i> partie et non la question réelle (très vague) ». Oui, la copie constructeur est la voie. Non, ce n'est pas le seul, la méthode d'usine fera très bien. Non, ce n'est pas le meilleur - nous n'avons aucune idée des contraintes et des hypothèses que vous avez.
@Alf Je peux dire que ma question est claire pour vous - pouvez-vous offrir plus de suggestions sur la manière de trouver des questions en général? J'aimerais pouvoir poser une question qui ajoute de la valeur au site et obtient des réponses précieuses, mais dans ce cas, il semble que j'ai un peu échoué ... mal comprise, la bownvote et j'ai fini par être un peu frustré.
Eh bien, je peux voir la répartition des votes et il n'y a pas de votes. Pas de votes, non plus, mais ce n'était pas le point, n'est-ce pas? Le HOWTO standard serait Catb.org/~esr/faqs/smart-Questions.html - C'est gentil et du point. Sur la question actuelle, je dirais que mettre le blâme sur des personnes qui ont essayé d'aider ne sont pas une idée très productive; indiquant que votre question est claire lorsque vous avez besoin de deux modifications est si proche de la blâme que seuls quelques-uns remarqueront la différence. Ajouter ici "Merci de lire ma question" et vous obtiendrez une dose d'agression juste. Etre gentil. Réparer les erreurs. Ne pas blâmer
... et oui, "Je peux dire que ma question est claire" - les gens se fâchent-ils si quelqu'un prétendait connaître leur esprit. Je fais effectivement. Cela peut être très bien dans une vraie chat en tête-à-une, mais pas sur le public.
Pour le dossier, je n'essaie pas de blâmer autant que j'essaie de contrer et de clarifier.