IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

methode d'interface inaccessible depuis classe metier!


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut methode d'interface inaccessible depuis classe metier!
    Bonjour,

    je bosse sur un tp de gestion de machine.
    J'ai fait toute la partie métier.
    Maintenant j'attaque la partie connexion à la base.
    Pour cela je défini une interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package baseDeDonnees;
    import java.sql.Connection;
    import java.sql.ResultSet;
     
    public interface AccesBaseDeDonnees {
    	public ResultSet lireDB(String rqtSQL);
    	public void ecrire(String SQL);
    	public void connecter();
    	public void deconnecter();
    }
    Dans la partie métier je souhaite lire des données dans la base
    mais je n'ai pas acces à la méthode lire(String rqtSQL). J'obtiens une erreur de compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultSet rst=AccesBaseDeDonnees.lireDB("Select * From Marque");
    Eclipse me demande de modifier lireDB en static alors que dans l'interface il n'est autorisé que des public et/ou abstract.
    Vu que je ne sais pas comment sera implémenté AccesBaseDeDonnees,je pense qu'il est obligatoire de passer par l'interface pour accéder à la base de données.

    Donc pouvez-vous me dire ce que j'ai manqué?

    j'ai déjà créé une classe qui implémente accesBaseDeDonnees mais les méthodes sont vide, et cela ne résout en rien mon problème.

    Autre question:
    J'ai créer une classe BaseDeDonnées qui définit la base à "attaquer" et l'utilisateur. Elle se trouvee du coté métier, mais je me demande si elle ne devrait pas se trouver "de l'autre coté" vu quelle définit aussi le jdbc à utiliser pour attaquer la base.
    Je suppose que soit l'interface, soit la classe qui implémente l'interface doit étendre baseDeDonnees. je me trompe??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    package baseDeDonnees;
     
    public class BaseDeDonnees {
    	private String host=new String();
    	private String port=new String();
    	private String nomBase = new String();
    	private String url=new String();
    	private Utilisateur user;
    	/**
             * @param host
             * @param port
             * @param nomBase
             * @param user
             */
    	public BaseDeDonnees(String host, String port, String nomBase,
    			Utilisateur user) {
    		this.host = host;
    		this.port = port;
    		this.nomBase = nomBase;
    		this.user = user;
    		init();
    	}
     
    	public BaseDeDonnees(String host, String port, String nomBase,
    			String nomUtilisateur, String password) {
    		this.host = host;
    		this.port = port;
    		this.nomBase = nomBase;
    		this.user = new Utilisateur(nomUtilisateur,password);
    		init();
    	}
    	/**
             * @equivaut à un setUrl mais avec les données de l'objet host,port et nom de la base;
             */
    	private void init(){
    		this.url = "jdbc:oracle:thin:@" + this.host + ":" + this.port+ ":" + this.nomBase;
    	}
    	/**
             * @return the host
             */
    	public String getHost() {
    		return host;
    	}
    	/**
             * @param host the host to set
             */
    	public void setHost(String host) {
    		this.host = host;
    	}
    	/**
             * @return the port
             */
    	public String getPort() {
    		return port;
    	}
    	/**
             * @param port the port to set
             */
    	public void setPort(String port) {
    		this.port = port;
    	}
    	/**
             * @return the nomBase
             */
    	public String getNomBase() {
    		return nomBase;
    	}
    	/**
             * @param nomBase the nomBase to set
             */
    	public void setNomBase(String nomBase) {
    		this.nomBase = nomBase;
    	}
    	/**
             * @return the user
             */
    	public Utilisateur getUser() {
    		return user;
    	}
    	/**
             * @param user the user to set
             */
    	public void setUser(Utilisateur user) {
    		this.user = user;
    	}
    	/**
             * @return the url
             */
    	public String getUrl() {
    		return url;
    	}
     
    }


    Merci d'avance

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Bonjour, on ne peut appeler des méthodes sur des classes que si elles sont déclarées static, or comme tu l'a vu, on ne peut pas mettre de static dans une interface.

    Tu dois donc créer une instance de la classe qui implémente AccesBaseDeDonnees et ensuite tu pourras appeler les méthodes de l'interface dessus.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AccesBaseDeDonnees acces = new AccesBaseDeDonneesImpl();
    acces.lireDB("toto");
    Pour ta 2è question, pourquoi BaseDeDonnees n'implémenterai pas directement AccesBaseDeDonnees ?

  3. #3
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Merci,

    En fait je souhaiterais faire une interface + une implémentation donc, qui si on change de base de données (pour l'instant c'est sur oracle, mais à l'avenir on pourrait passer sur MySQL), m'éviterais de "refactoriser" tout le code.

    CheryBen, tu me demandes pourquoi BaseDeDonnees n'implémenterait pas directement AccesBaseDeDonnees. Très bonne question, Je me le demandais hier soir.

    En fait, tu dois le savoir, pour attaquer une base de données il faut:
    • 1 driver (ici oracle.jdbc.driver.OracleDriver())
    • 1"urlDriver" (jdbc:oracle:thin)
    • 1 host (127.xxx.xxx.xxx)
    • 1 port
    • 1 nomBaseDeDonnees (baseOracle)
    • 1 utilisateur (nomUtilisateur + password)

    urlDriver + host + port + nomBaseDeDonnees l'url
    Driver + url + utilisateur connection
    Depuis hier soir je me triture le cerveau pour trouver un architecture qui:
    • contient toutes les données citées précédemment.
    • possède les méthodes d'AccesBaseDeDonnees.

    De tel façon que j'ai déjà une bonne partie du boulot de déjà fait concernant la connection à la base. Et que dans les implémentations je n'ai plus qu'a définir le Driver ainsi que les différentes requêtes SQL des méthodes qui seront appelées depuis le "métier" (LireMarque, LireMachine, InsereMarque...)

    Quel conseil me donnerais-tu pour que tout ceci soit le plus maniable et modulable possible?

    Encore merci
    (Tu dois me trouver un peu lourd tout de même.)

  4. #4
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    En fait ce que tu cherches à faire (l'indépendance du serveur de base de données) est déjà offert par jdbc, c'est son principe même.

    Ce que tu devrais faire pour pouvoir changer de base de donnée à volonté en ayant une seule implémentation, c'est mettre les paramètres dans un fichier de configuration que tu peux charger facilement en utilisant la classe Properties.

    Globalement, si tu fais un fichier xml de configuration, tu as juste à appeler la méthode loadFromXML et ensuite getProperty pour récupérer les valeurs.

    Pour permettre de localiser le fichier de configuration, en général son chemin est donné en paramètre à l'application. (ou bien le chemin du répertoire dans lequel il se trouve)

    Avec sa, tu as une seule implémentation et la base de données peut-être modifiée à volonté sans recompilation.

    ps : visiblement tu te poses les bonnes questions donc ce n'est pas une corvée de te répondre, sinon je ne le ferai pas

  5. #5
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par CheryBen Voir le message
    ps : visiblement tu te poses les bonnes questions donc ce n'est pas une corvée de te répondre, sinon je ne le ferai pas
    merci ça fait plaisir à lire

    Je vais essayé de faire un fichier de configuration XML.

    Maintenant je pense que je vais faire implementer AccesBaseDeDonnees par BaseDeDonnees. J'ai vu qu'il était possible de mettre des propriétés dans une interface mais comment y accéder?
    je reviens au même problème que hier. Je dois donc les mettre en attribut dans la classe qui implemente mon interface.
    Donc a quoi cela sert de mettre des attributs dans une interface?

    Je vais radoter "encore Merci" (une fois la trentaine passée on devient cénile )

  6. #6
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Les attributs dans les interfaces servent surtout à mettre des constantes static.

    Sinon tu as une autre solution, tu peux faire une classe abstraite qui implémente AccesBaseDeDonnees, sans en définir les méthodes, en y mettant les attributs que tu veux. Ainsi tu peux faire hériter BaseDeDonnees de la classe abstraite, et elle devra redéfinir les méthodes de l'interface.

Discussions similaires

  1. classe applicative et classe metier ?
    Par sali dans le forum Diagrammes de Classes
    Réponses: 7
    Dernier message: 08/07/2009, 23h52
  2. Classe inaccessible depuis un projet Silverlight
    Par cyberbobby dans le forum Windows Communication Foundation
    Réponses: 6
    Dernier message: 25/05/2009, 15h33
  3. [EJB2] Accès Interface locale depuis une classe métier.
    Par rigor dans le forum Java EE
    Réponses: 2
    Dernier message: 10/10/2006, 14h44
  4. [DC] Modéliser une classe interface + une autre classe
    Par sangei dans le forum Diagrammes de Classes
    Réponses: 11
    Dernier message: 21/12/2005, 22h46
  5. Plesk Linux, Interface inaccessible
    Par thibaut06 dans le forum Débuter
    Réponses: 7
    Dernier message: 06/11/2005, 23h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo