Héritage et polymorphisme

nicosan -  
 nicosan -
Bonjour et merci de lire mon message,

Voilà, je suis un futur jeune diplômé en informatique et aujourd'hui, pour un projet personnel que je développe en Java, je rencontre un problème que je pensais pouvoir résoudre.


Je suis en train de programmer le système de connexion à mon application (reliée à une base de données). Le problème est que j'ai un diagramme de classes contentant des généralisations/spécialisations et j'aurais aimé implémenter une méthode dans une classe mère mais qui diffère selon le type d'objet (la spécialisation).


voici mon diagramme : http://puu.sh/33QH3.png


j'avais créé une fonction qui vérifiait si on avait un objet Gestionnaire ou Client, mais je me suis très vite souvenu que je n'aurais pas accès aux attributs de ces objets et donc, l'enregistrement complet ne serait pas possible :


public void inscription(Database db, ArrayList<?> o){
	if(this.getClass()==Client.class){
			
	}
	else if (this.getClass()==Gestionnaire.class){
		
	}
}


Est-ce possible de créer une méthode dans la super classe et avoir accès aux attributs des sous classes ?

Merci


3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
this.getClass()==Client.class, pour comparer deux objets utilises la méthode equals, mais sinon ici on peux faire plus simple avec instanceof

public void inscription(Database db, ArrayList<?> o)
{
    if (this instanceof Client)
        Client clt = (Client) this;
    else if (this instanceof Gestionnaire)
        Gestionnaire gest = (Gestionnaire) this;
}

Cependant, ceci est une mauvaise idée, car cela signifie que ta classe Utilisateur est obligée de connaitre la liste exhaustive de ses classes filles au moment du développement, ce qui n'est pas correct. S'il est nécessaire plus tard d'étendre un troisième type d'Utilisateur, il faudra alors modifier encore la classe Utilisateur, c'est contraire à l'esprit de la programmation objet.

Il vaudrait mieux redéfinir pour chaque classe fille, soit la méthode inscription, soit une méthode auxiliaire utilisée par la méthode inscription, je ne sais pas ce qui est le mieux il faudrait voir ce que tu veux faire avec ton inscription.
0
nicosan
 
Merci pour ta réponse.

Effectivement, le instanceof... je ne sais pas pourquoi je n'y ai pas pensé, j'ai l'habitude de l'utiliser.

Avec ma méthode inscription, je voudrais faire une requête SQL qui enregistre l'utilisateur dans la base de donnée. Il faut savoir que j'ai créé une table "Utilisateur" qui selon le type d'objet qu'on y enregistre, prends un type "client" ou "gestionnaire". Le deuxième but de la fonction est d'ajouter l'utilisateur à une liste de client ou une liste de gestionnaire chargée en mémoire.

Je comprends bien ce que tu veux dire et c'est vrai que ce n'est pas très joli de devoir connaître la liste des classes. Du coup, je pense que je vais redéfinir les méthodes dans les classes dérivées.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
S'il n'y a que la requête qui change il suffit de redéfinir une méthode auxiliaire qui te renvoie juste la requête qu'il faut pour faire ton inscription.

Exemple :

public abstract class Utilisateur extends Personne
{
    protected abstract String requete();
    
    public void inscription(Database db, ArrayList<?> o)
    {
        String req = requete();
        ...
    }
}

public class Client extends Utilisateur
{
    protected String requete()
    {
        return "insert into 'Client' values ...";
    }
}

public class Gestionnaire extends Utilisateur
{
    protected String requete()
    {
        return "insert into 'Gestionnaire' values ...";
    }
}
0
nicosan
 
Oh oui, c'est une excellente idée ça ! Merci beaucoup !
0