Est-il possible d'instancier une classe enfant avec le parent de l'objet en java?
J'ai une classe de base-dire
class A {
private String name;
private String age;
//setters and getters for same
}
et un enfant de la classe de dire
class B extends A {
private String phone;
private String address;
//setters and getters for same
}
maintenant, j'ai une instance d'Un et en plus de cela je dois définir les champs de B, donc le code serait comme,
A instanceOfA = gotAFromSomewhere();
B instanceOfB = constructBFrom(instanceOfA);
instanceOfB.setPhone(getPhoneFromSomewhere());
instanceOfB.setAddress(getAddressFromSomewhere());
je peux instancier B avec A, mais je ne veux pas faire de cette façon,
B constructBFrom(A instanceOfA) {
final B instanceOfB = new B();
instanceOfB.setName(instanceOfA.getName());
instanceOfB.setPhone(instanceOfA.getAge());
return B;
}
plutôt ce que j'aimerais avoir une certaine utilité avec la fonction qui est suffisamment générique pour construire l'objet,
public class SomeUtility {
public static <T1, T2> T2 constructFrom(T1 instanceOfT1, Class<T2> className) {
T2 instatnceOfT2 = null;
try {
instatnceOfT2 = className.newInstance();
/*
* Identifies the fields in instanceOfT1 which has same name in T2
* and sets only these fields and leaves the other fields as it is.
*/
} catch (InstantiationException | IllegalAccessException e) {
//handle exception
}
return instatnceOfT2;
}
}
de sorte que je peux l'utiliser comme,
B constructBFrom(A instanceOfA) {
return SomeUtility.constructFrom(instanceOfA, B.class);
}
En outre, les cas d'utilisation ne sera pas seulement limitée à parent-enfant des classes, plutôt cette fonction d'utilité peut être utilisé pour l'utilisation de l'adaptateur cas.
PS - A et B sont des tiers les classes que j'ai pour utiliser ces classes seulement donc je ne peux pas faire toutes les modifications
en A et B.
B
constructeur qui accepte un A
.Qu'attendez-vous de l'résultant
B
ressembler? Simplement une copie de l'instance de A
avec les champs de B
définie à null?sonne comme un XY problème pour moi... Quelle est la réel problème que vous essayez de résoudre? Je ne peux pas imaginer que tout bon cas d'utilisation pour essayer de le faire.
un décent cas d'utilisation peut être par exemple la création d'une
XXXList
basé sur le générique List
. Bien que vous avez probablement raison - je suis aussi assez méfiant sur les OP de la motivation 🙂Il n'y a aucun moyen de définir le nom et l'âge d'un
B
de toute façon sans appeler explicitement setName
et setAge
, car comme l'écrit B
n'a pas un constructeur qui prend le nom et l'âge en tant que paramètres. Par la voie, instanceOfA.getPhone()
est une erreur de compilation, depuis A
n'a pas phone
ou getPhone
.
OriginalL'auteur shelly | 2014-07-07
Vous devez vous connecter pour publier un commentaire.
La bonne pratique est d'avoir un usine classe qui "produit" le cas de
B
.Vous ont pour écrire le code de la méthode de fabrique, comme il n'y a pas moyen de créer un enfant de classe en fonction de sa classe parente. C'est toujours spécifique et dépend de la logique des classes.
Cependant, considérez si c'est vraiment ce dont vous avez besoin. Il y a pas beaucoup de smart des cas d'utilisation pour l'instanciation d'une classe basée sur l'exemple de ses parents. Un bon exemple est ArrayList(Collection c) - construit un spécifiques liste ("enfant") contenant les éléments de la générique collection ("base").
En fait, pour beaucoup de situation, il y est un modèle pour éviter ces étranges constructions. Je suis conscient qu'il n'est probablement pas applicable à votre cas précis, comme vous avez écrit que votre Base et de l'Enfant sont 3e partie des classes. Toutefois, votre question titre est suffisamment générique donc, je pense que vous pourriez trouver utiles.
IBase
Base
implémenter l'interfaceChild
utilisationBase
au lieu d'hériter ilChild
mettre en œuvreIBase
et de déléguer toutes les méthodes deIBase
à l'instance deBase
Votre code devrait ressembler à ceci:
Après avoir édité votre question, je doute encore plus fort que ce que vous voulez, c'est bon. Votre question ressemble plus à une tentative de hack, de violer (ou de ne pas comprendre) les principes de la la classe de base orientée objet concept. Me semble que quelqu'un venant de l'JavaScript mot et en essayant de garder le style de programmation JavaScript et il suffit d'utiliser une autre syntaxe de Java, au lieu d'adopter une langue différente de la philosophie.
Fun-fact: l'Instanciation d'un objet enfant avec le parent de l'objet est possible dans basé sur des prototypes langues, voir l'exemple en JavaScript 1.8.5:
vous avez absolument raison. J'ai ajouté une note.
OriginalL'auteur Honza Zidek
À mon avis, la façon dont vous voulez éviter est très approprié. Il doit y avoir un bout de code quelque part.
Si vous ne pouvez pas mettre de la méthode dans la classe cible viens de le mettre quelque part d'autre (une usine). Vous devez en outre faire de votre méthode
static
.Prendre un coup d'oeil à Méthode de fabrique de modèle.
2ème option serait l'extension de B et de la place de cette méthode dans l'usine de méthode statique dans cette nouvelle classe. Mais cette solution semble être la plus compliquée pour moi. Vous pouvez ensuite appeler
NewB.fromA(A)
. Vous devriez être en mesure d'utiliser ensuite votre NewB au lieu de "B".OriginalL'auteur damienix
Vous pourriez le faire par l'intermédiaire de réflexion:
*Au-dessus de code copié à partir de tutoriel en ligne
OriginalL'auteur AllDayAmazing