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

Langage Java Discussion :

interfaces et statique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut interfaces et statique
    Bonjour, j'ai un problème lié à l'imposibilité de mettre des fonctions statiques dans une interface, et bien qu'ayant vu plein de message parlant de ça je n'ai pas encore trouvé de réponse adaptée...

    Je voudrais implementer un algo valide sur different corps.

    Je voudrais pouvoir utiliser mon code en gros comme cela dans l'idéal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class GF17 extends GFp { static int modulo=17; }
     
    public class Algo {
        GFelement<GF17> a;
        GFelement<GF17> b;
     
        public GFelement<GF17> monalgo() {
           a=new GFelement<GF17>(val_a);
           b=new GFelement<GF17>(val_b);
           return GF17.add(a,b);
       }
    }

    toutes les solutions que j'ai essayé ne marchent pas... Existe -t-il un moyen de faire ça proprement en Java ?

  2. #2
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Est ce que tu pourrais détailler ta problématique... car la c'est un peu obscure..

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut précision
    bon, par exemple, une version qui marche presque...

    je défini une interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface GF {
        int add(int a,int b);
    }
    ensuite je défini une classe abstraite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public abstract class GFp implements GF {
        int modulo;
        public int add(int a,int b) {
    	return (a+b)%modulo;
        }
    }
    enfin une classe pour les elements d'un corps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class GFelem<T extends GFp> {
        private int value;
     
        public GFelem(int v) { value=v; }
        public int intValue() { return value; }
        public GFelem<T> add(GFelem<T> a) {
    	return new GFelem<T>(T.add(value,a.intValue()));
        }
    }
    Ensuite, j'utilise tout ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class GFp17 extends GFp {
        static int modulo=17;
    }
     
    public class Main {
        public static final void main(String[] args) {
    	GFelem<GFp17> a=new GFelem<GFp17>(12);
     
    	a.add(a);
     
    	System.out.println(a.intValue());
        }
    }
    Ça compile... mais à l'execution, erreur, add n'est pas une méthode statique.
    Je sais, et je suis d'accord, ça n'a pas de raison de marcher...
    Mais je ne vois pas comment concevoir mes classes pour obtenir une utilisation vraiment simple, et ce avec la possibilité de définir de nouveaux corps facilement.

    C'est plus clair ?

  4. #4
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Salut,

    je crois que l'erreur est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class GFelem<T extends GFp> {
        private int value;
     
        public GFelem(int v) { value=v; }
        public int intValue() { return value; }
        public GFelem<T> add(GFelem<T> a) {
    	return new GFelem<T>(T.add(value,a.intValue()));
        }
    }
    ça devrait pas être a.add()...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut
    Et bien non justement, je ne veux pas "a.add".
    Je voudrais que mon element utilise l'addition du corps auquel il appartient.
    Comme ça, je pourrais creer un GFelement<blabla> sans me preoccuper de comment faire les operations dans blabla.

    Mon probleme c'est que j'aimerais vraiment faire la difference entre corps et les elements du corps... (mais peut etre que c'est une mauvaise idee)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Tu fais une classe GFp17 derive de GFp, avec un champ static modulo qui vaut 17. Le probleme c'est que ce champ n'est pas le champ utilisé dans add. D'une manière générale, tu ne peux pas spécialiser un champ static dans une classe derivée.

    Si tu veux spécialiser un comportement, il faut obligatoirement passer par une methode d'instance, et pas de classe.

    Tu peux peut etre t'en sortir en déclarant un champ static algo dans GFElem, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class GFElem<T extends GFp> {
        static T algo = new T();
        public GFelem<T> add(GFelem<T> a) {
    	return new GFelem<T>(algo.add(value,a.intValue()));
        }
    }
    Mais personnellement, je ne poursuiverais pas dans cette voie. Ca semble un peu surspecifié. Je te conseille de simplifier un peu tout ca, ca sera sans doute plus vite developpé, plus maintenable, et le jour ou tu auras vraiment le besoin, tu auras alors l'experience pour trouver la solution adequate.

Discussions similaires

  1. Interfaces/Classes abstraites et méthodes statiques
    Par Zakapatul dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/01/2009, 14h38
  2. Interface graphique "statique" ou "objet" ?
    Par agent007se dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 22/01/2007, 01h16
  3. Réponses: 4
    Dernier message: 13/09/2006, 16h02
  4. Interface et attributs statiques
    Par Mayhem dans le forum Langage
    Réponses: 4
    Dernier message: 20/06/2006, 16h24
  5. [C#] interface, méthodes statiques ?
    Par gmonta dans le forum C#
    Réponses: 6
    Dernier message: 02/12/2005, 10h27

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