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 :

[Language]classe abstraite


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut [Language]classe abstraite
    Bonjour,

    voila, j'ai une classe MonVecteur ou il y a une méthode :

    -MonVecteur getSubset(int index1,int index2) qui me renvoie le MonVecteur comprenant les éléments de l'index1 à l'index2

    jusqu'ici tout va bien.

    puis je dois créer une classe MaSequence qui hérite de MonVecteur et je veux que la classe Masequence dispose d'une méthode MaSequence getSubset(int index1,int index2) sans réecrire intégralemnt dans MaSequence la méthode équivalente de la classe MonVecteur.

    je pense qu'il faut utiliser un classe abstraite mais j'ai un peu de mal ,je ne sais pas encore bien utiliser les classes abstraites.

    ou(si pas d'utilisation de la classe abstraite) comment dois je faire ?

  2. #2
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Dans l'exemple que tu nous as donné, je ne vois pas l'interet de faire une classe abstraite, tu peux trés bien faire de l'héritage simple sans mettre ta classe mère en classe abstraite.

    Les classes abstraites sont des classes non instaciable (ex la classe Chien étends la classe abstraite Animal, on peut instancier un objet chien mais pas un animal, un Animal ca peut etre tout et n'importe quoi ! ). Donc, comme apparement tu utilises (instancies) ta classe MonVecteur, je ne te conseille pas de la mettre abstraite

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Par défaut
    j'ai peut etre pas tout compris mais peut etre que ca correspond a ce que tu veux :
    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
     
     
    public abstract class MaCollection {
     
    public MaCollection getSubset(){
    //traitement commun a toute les MaCollection
    maMethodeSpecifique1();
    //traitement commun 
    maMethodeSpecifique2();
    }
     
    public abstract void maMethodeSpecifique1();
    public abstract void maMethodeSpecifique2();
     
    }
    Ensuite MonVecteur heriteras de MaCollection et implementeras les 2 methodes abstraites , et MaSequence peut alors soit herité directement de MaCOllection si pas methode commune avec MonVecteur , mais imaginons que MaSequence ai besoins de maMethodeSpecifique1() mais differe dans maMethodeSpecifique2 alors elle heriteras de MonVecteur et redefiniras maMethodeSpecifique2() !!!
    en esperant que ca t'aide !!

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    ba j'ai toujours pas reussi voici mon code :

    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
    public class MonVecteur{
     protected  Object [] data;
     protected  int size=0;
     protected int defaultMaxSize=10;
     
      public MonVecteur()
      {
        data=new Object [defaultMaxSize];
      }
     
    public void affiche()
      {
          for(int i=0;i<this.size();i++)
      	{
      		System.out.print(data[i] +"| ");
      	}
      }
    public MonVecteur getSubset(int index1,int index2)
        {
        	MonVecteur v=new MonVecteur();
        	if(index1==0)
        	{
        		System.out.println("\n l'index1 doit etre superieur a 0 !");
        	}
        	else
        	{
     
        		int j=0;
        		for(int i=index1;i<=index2;i++)
        		{
        			v.add(j,this.data[i-1]);
        			j++;
        		}
        	}
        	return v;
     
     
        }
     
    }
     
    class Test
    {
        public static void main(String [] args )
    	{
    		MonVecteur leVecteur=new MonVecteur();
                                   leVecteur.add("1");
    		leVecteur.add("2");
    		leVecteur.add("3");
     
    MaSequence s=new MaSequence();
     
    		s=(MaSequence)leVecteur;
    		s=s.getSubset(1,3);
    		System.out.print("\n"+ "element de maSequence apres appel a la fonction getSubset : ");
    		s.affiche();
     
    	}
    }
     
     
    public class MaSequence extends MonVecteur
    {
    	public MaSequence()
    	{
    		super();
    	}
     
    	public MaSequence getSubset(int index1,int index2)
    	{
    		MaSequence s=null;
    		s=(MaSequence)super.getSubset(index1,index2);
    		return s;
    	}
    }
    et voici l'erreur que ca me retourne :
    Exception
    in thread "main" java.lang.ClassCastException: MonVecteur
    at Test.main(MonVecteur.java:278)
    Press any key to continue...

    quelqu'un aurait une idée ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Par défaut
    C'est normal que ca ne marche pas puisque ta methode getSubset retourne un MonVecteur et qu'un monVecteur n'est pas un Subset (c'est l'inverse) !!

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    merci mais comment ca c'est l'inverse ??

    tu dis "monVecteur n'est pas un subset" (je comprends pas )

  7. #7
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    Tu ne peux pas caster un object MonVecteur en MaSequence, par contre tu peux définir un constructeur de MaSequence qui prend en argument un objet de type MonVecteur. Voici la signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public MaSequence(MonVecteur vecteur) { ...}
    Ensuite, dans ta méthode, tu invoque ce constructeur pour retourner un résultat de type MaSequence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public MaSequence getSubset(int index1,int index2)
       {
          MaSequence s=null;
          s= new MaSequence(super.getSubset(index1,index2));
          return s;
       }
    Ceci dit, l'intérêt de ce que tu veux faire m'échappe un peu... Quelle est la différence entre les deux classes ?

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Par défaut
    tu peux essayé un truc de ce genre :

    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
     
    public class MonVecteur {
     
    //...
    public MonVecteur getSubset(int index1,int index2)
        {
           MonVecteur v=getNewInstance();
           if(index1==0)
           {
              System.out.println("\n l'index1 doit etre superieur a 0 !");
           }
           else
           {
     
              int j=0;
              for(int i=index1;i<=index2;i++)
              {
                 v.add(j,this.data[i-1]);
                 j++;
              }
           }
           return v;
    }
     
    private MonVecteur getNewInstance(){
    return new MonVecteur();
    }
    }
     
     
     
    public class MaSequence extends MonVecteur {
    //...
     
    private MonVecteur getNewInstance(){
    return new MaSequence();
    }
    }
    bon alors c'est loin d'etre complet et parfait (je vient d'improviser donc c'est à valider) , en l'occurence je me demande s'il vaut mieux que le type de retour de getNewInstance() de MaSequence retourne un MaSequence ou un MonVecteur ceci dit ce devrais rien changer dans ton cas les fonctionnerais !!

    Mais il me semble que dans le code que tu nous a montrer MonVecteur n'as pas de methode add , or tu l'utilise dans getSubset() !!!

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    il n'y a pas trop d'interet je crois ,c'est pour les cours, le prof veut nous apprendre a utiliser l'heritage je pense.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Par défaut
    D'abord je suis d'accord avec Xavinou je vois pas tres bien l'interet
    Ensuite
    Citation Envoyé par mikees
    merci mais comment ca c'est l'inverse ??

    tu dis "monVecteur n'est pas un subset" (je comprends pas )
    si tu as une classe Vehicule et que Voiture herite de vehicule tu peut dire qu'une voiture est un vehicule mais tu peux pas dire qu'un vehicule est une voiture ca peut etre n'importe quoi d'autre (bateau avion ...)

    De meme MaSequence est un MonVecteur mais un MonVecteur n'ets pas forcement un MaSequence !!!!!!

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    FreshVic, j'ai oublie de mettre la fonction add() comme bien d'autre fonction car c'etait trop long mais t'inquietes pas,la fonction est bien présente dans ma classe.


    par contre je ne comprends pas ce que tu veux que je fasse ??

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Par défaut
    Citation Envoyé par mikees
    FreshVic, j'ai oublie de mettre la fonction add() comme bien d'autre fonction car c'etait trop long mais t'inquietes pas,la fonction est bien présente dans ma classe.


    par contre je ne comprends pas ce que tu veux que je fasse ??
    Le code de Xavinou devrais fonctionner aussi , moi ce que je te propose d'implementer une nouvelles methode getNewInstance()
    methode qui sera appelé dans getSubset !! si l'instance qui appelle getSubset est une maSequence getNewInstance te retourneras un Masequence et dans le cas d'un MonVecteur tu auras un MonVecteur !!

  13. #13
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Citation Envoyé par Xavinou
    Tu ne peux pas caster un object MonVecteur en MaSequence, par contre tu peux définir un constructeur de MaSequence qui prend en argument un objet de type MonVecteur. Voici la signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public MaSequence(MonVecteur vecteur) { ...}
    Ensuite, dans ta méthode, tu invoque ce constructeur pour retourner un résultat de type MaSequence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public MaSequence getSubset(int index1,int index2)
       {
          MaSequence s=null;
          s= new MaSequence(super.getSubset(index1,index2));
          return s;
       }
    Ceci dit, l'intérêt de ce que tu veux faire m'échappe un peu... Quelle est la différence entre les deux classes ?

    euh je crois que je suis crevé la, je dois mettre quoi dans le constructeur public MaSequence(MonVecteur veccteur) ? . moi ce que je veux ,c'est creer un MaSequence qui soit identique a LeVecteur crée avant . puis j'appelle la méthode getSubset(int index1,int index2) de MaSequence qui me retourne donc un MaSequence contenant les element de LeVecteur de l'index 1 a l'index2.

    je sais pas si j'ai ete clair ? lol

  14. #14
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    bon ba merci a tout le monde ,je viens de reussir!! c'etait pas compliqué mais je sais pas pourquoi j'ai bloqué!!

  15. #15
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    à vrai dire tu as été très clair ! tu veux qu'on fasse tes devoirs ;-)

    Le plus simple à mon avis, pour implémenter ton constructeur MaSequence(MonVecteur), c'est d'abord de créer un constructeur MonVecteur (MonVecteur) : on appelle ça un constructeur par recopie.

    Donc tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public MonVecteur(MonVecteur vecteur) {
        super();
        // ici il faut que tu initialises ton vecteur courant (this) 
        // avec celui passé en parametre
       this.size = vecteur.size;
       ...
    }
    Attention, le piège c'est que les deux vecteurs pointent sur le même tableau de données...

    ensuite, ton constructeur dans MaSequence est tout simple à écrire, tu n'as qu'à invoquer le constructeur de MonVecteur (car il n'y pas de données membres spécifiques à MaSequence) : avec le mot clé super.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public MaSequence(MonVecteur vecteur) {
        super(vecteur);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Language]Classe abstraite
    Par pugnator dans le forum Langage
    Réponses: 10
    Dernier message: 15/12/2005, 16h01
  2. Réponses: 2
    Dernier message: 27/03/2005, 16h09
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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