Créer une instance à partir d'une instance de superclasse
Considérons le cas suivant:
class A {
int x;
int y;
}
class B extends A {
int z;
}
Maintenant, quelque part dans le code de cette classes sont utilisées comme ceci:
A objA = getAFromSomewhere();
B objB = null;
Et dans une certaine situation, je veux faire quelque chose comme
objB = objA; //can't do this
objB.z = someZ;
Bien sûr, la réalité, les objets sont un peu plus compliquée, ce n'est pas seulement à propos de la copie de deux entiers. Mais ils ne sont pas trop complexes, soit.
Je sais que je peux écrire un constructeur de B comme ceci:
public B(A anA) {
this.a = anA.a;
this.b = anA.b;
this.z = 0;
}
Mais si c'est vraiment la seule façon, je préfère fusionner les membres supplémentaires de B dans A.
mise à jour en considérant les réponses
Ma question n'était pas suffisamment claire. Je comprends que objB = objA; ne peuvent pas travailler (donc j'ai demandé "quelque chose comme", ce qui signifie quelque chose de comparable avec la complexité du code) et je connais les problèmes avec une faible vs profonde des copies.
Ce que je cherchais est la possibilité de copier les membres d'une classe de base (disons à l'aide de clone()). Vous pouvez comprendre que la copie de chaque membre manuellement est une mauvaise solution, car cela ajoute à la complexité et la redondance du code. Merci pour vos réponses en tout cas!
source d'informationauteur didi_X8
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de solution triviale, car il n'y a pas de one-size-fits-all solution. Fondamentalement, vous n'avez pas toutes les informations au sein d'un
B
de sorte que vous ne pouvez pas garantir que vous auriez un "sensible"B
objet.Vous probablement veux juste créer un constructeur en
B
qui prend unA
et des copies de tous lesA
données dans le nouveauB
.Il est un (relativement) solution triviale!
Mettre en œuvre un constructeur en
class B
qui prend une instance declass A
et copie les champs.L'une des raisons qu'il ne générique solution dans la langue elle-même est la cause du problème de la profondeur de la copie.
Par exemple, si l'objet source contient d'autres
Objects
par opposition à la plaine de types, ce qui serait la copie générique de l'opérateur? Il suffit de copier la référence (en donnant une copie), ou de faire des copies réelles?Quoi alors si l'un de ces objets est un
Collection
? Faut-il également copie de chaque élément de la collection, trop?La seule conclusion logique serait d'effectuer une peu profonde copie, mais alors vous n'avez pas vraiment obtenu une copie.
Si vous n'avez pas peur des communes-beanutils vous pouvez utiliser PropertyUtils
Si vous n'avez pas besoin de toutes les fonctionnalités d'Un, il ya aussi une option pour créer de la classe B, le stockage interne de la copie d'Une instance et de la mise en œuvre de certains sous-ensemble minimal de méthodes via l'interface C par l'utilisation de proxy à l'instance.
Je suis choqué aussi. 🙂
Vous ne pouvez vraiment pas faire cela:
objB = objA;
.Parce que Renault et BMW sont des voitures de mais ne voitures de BMW.
Remercier sur Une Voiture, B comme BMW.
Maintenant, vous dites:
...non pas parce que c'est ce que les gens devraient faire, mais plus parce que je me sentais comme un défi, voici un peu de code de test qui n'est qu'une simple copie de l'objet (à l'aide de setter et getter méthodes):
Peut-être que vous pourriez faire ceci:
Vous êtes encore à la liste de tous les le terrain, mais seulement une fois par classe.
Si vous changez votre méthode pour créer
B
objets, vous pouvez faire ce que vous voulez l'aide d':Cela peut même être inline, mais vous avez besoin de parenthèses:
Si non, vous devez aller un long chemin à l'aide de constructeurs:
Dans ce cas, je vous recommande de copier les domaines de la super-classe dans la superclasse. Autre chose, si vous ajoutez un champ à qui, plus tard, vous pouvez oublier de modifier la copie plus facilement.
Vous peut le faire si vos classes
A
etB
partagent le mêmepackage
ou si les variables dans votreA
classe est déclaréeprotected
. Ensuite, vous pouvez simplement accéder aux champs de la super-classe.Useage, bien sûr, est:
En supposant que votre classe A a une très soigné et propre setter et getter méthode convention de nommage comme
setXXX(Object xxx)
et corrrespondinggetXXX()
qui renvoie la même chose (Objet xxx ) comme un paramètre passé àsetXXX()
J'ai écrit une méthode utilitaire, à l'aide de la réflexion
Je pense que le meilleur moyen est d'utiliser une méthode de fabrique de créer des B des objets à partir d'Un des objets.