[JAVA]Transtypage

Cyril54 -  
 Cyril54 -
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 19031 Statut Modérateur 3 020
 
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
Cyril54
 
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 19031 Statut Modérateur 3 020
 
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
Cyril54
 
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 19031 Statut Modérateur 3 020
 
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
Cyril54
 
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 19031 Statut Modérateur 3 020
 
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
Cyril54
 
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 19031 Statut Modérateur 3 020
 
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