[JAVA]Transtypage

Fermé
Cyril54 - 8 mars 2012 à 21:25
 Cyril54 - 9 mars 2012 à 16:22
Bonjour,

J'ai 2 classes:

classe Clients propriétés: nom, prenom, adresse, solde
classe ClientsVIP propriétés: nom, prenom, adresse, solde, noMembre

La classe ClientsVIP est une classe dérivée de Clients.

Les 2 types de clients sont entrés dans un vecteur de type Clients. Lorsque je lance un executeUpdate pour inserer ce vecteur dans des tables SQL, il le fait tres bien pour les type Clients dans la table correspondante. Pour les types ClientsVIP, pour acceder au getter de noMembre, il m'a fallut transtyper ainsi:

...
for (Clients monVecteur : vect){
ClientsVIP transtypeClients = (ClientsVIP)monVecteur;
...
}


Sur netbean, aucune erreur n'est detectée. Or au run, il signale une ClassCastException precisant que Clients ne peut pas etre cast en ClientsVIP.

Pourtant, les 2 classes etant derivées, cela devrait etre possible non?

Merci de votre aide.

Bonne soirée :)

A voir également:

3 réponses

KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
Modifié par KX le 8/03/2012 à 21:40
Les deux classes ne sont pas dérivées, seule ClientsVIP est dérivée de Clients, pas l'inverse.
Donc si monVecteur est une instance de Clients mais qu'il n'est pas instance de ClientsVIP alors nécessairement ça va planter, en particulier ici parce que le noMembre est impossible à déterminer puisqu'il n'existe pas...

Tu devrais faire un constructeur spécifique pour faire ce genre de manipulation :

ClientsVIP transtypeClients;

if (monVecteur instanceof ClientsVIP)
    transtypeClients = (ClientsVIP) monVecteur;
else
    transtypeClients = new ClientsVIP(monVecteur,noMembre);
La confiance n'exclut pas le contrôle
0
Merci pour ta réponse, je suis vraiment debutant en JAVA :)

L'ennui, c'est que je n'arrive pas à atteindre noMembre (il est en private dans la classe ClientsVIP et son getter est non static)
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
8 mars 2012 à 21:57
En l'occurrence ce n'est pas un getter qu'il te faut mais un setter... et évidemment qu'il n'est pas static sinon il ne servirait pas à grand chose... par contre si tu fais un nouveau constructeur de la classe ClientsVIP tu auras accès aux membres private de ClientsVIP donc ce n'est pas un problème a priori.
0
J'ai oublié de preciser que je travaillais sur une classe main nommée Interface dans laquelle a été déclarée le vecteur.

Mes faibles compétences ne me permettent malheureusement pas de créer un tel constructeur (monVecteur a été créé dans le for each, dans la main class)

Il faut vraiment que je boss ma POO :D

Merci beaucoup KX, déjà quelques erreurs que je ne referais plus :)
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
8 mars 2012 à 22:32
Qu'est-ce que tu as comme constructeur de ClientsVIP disponible ?
À défaut de pouvoir en créer un nouveau tu peux utiliser ceux qui existent déjà...
0
public ClientsVIP(String nom, String prenom, String adresse, String solde, String noMembre) {
super(nom, prenom, adresse, solde);
this.noMembre = noMembre;
}
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
8 mars 2012 à 22:55
Donc si tu peux rajouter un constructeur à ClientsVIP tu peux faire :

public ClientsVIP(Clients client, String noMembre)
{
    super(client); // si le constructeur par copie de Clients existe
    // super(client.nom, client.prenom, client.adresse, client.solde); // sinon
    this.noMembre = noMembre;
}

transtypeClients = new ClientsVIP(monVecteur,noMembre); // comme plus haut

Sinon, tu peux faire comme ceci mais c'est moins propre...

transtypeClients = new ClientsVIP(monVecteur.getNom(), monVecteur.getPrenom(), monVecteur.getAdresse(), monVecteur.getSolde(), noMembre);
0
j'ai du remplacer

super(client.nom, client.prenom, client.adresse, client.solde)

par
super(client.getNom, client.getPrenom, client.getAdresse, client.getSolde)


il me mettait que ces propriétés etaient private donc pas utilisables.
A part ça , j'ai pu faire un constructeur comme tu l'as indiqué.

/*en revanche dans */ transtypeClients = new ClientsVIP(monVecteur,noMembre)


impossible d'aller chercher noMembre
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
9 mars 2012 à 07:47
C'est normal, il n'existe pas. En effet c'est l'information manquante qui fait que ton Clients n'est pas un ClientsVIP. Si tu veux le caster en ClientsVIP alors tu dois lui rajouter cette information.
Mais du coup tu peux mettre ce que tu veux, null, "", getNom, ou autre chose...

Remarque : c'est quand même très restrictif d'avoir mis nom, prenom etc... en private alors que typiquement c'est protected qu'il aurait fallu mettre.
0