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 :

Comment faire une classe abstraite avec un constructeur


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de zemzoum89
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    373
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 373
    Points : 131
    Points
    131
    Par défaut Comment faire une classe abstraite avec un constructeur
    Bonjour voila la on nous demande:
    Ecrire une classe abstraite Copieur dont la méthode concrète void transmet() lit sur un flot de type InputStream et copie le contenu sur un flot de type OutputStream. Les flots d'entrée et de sortie seront passés en paramètre du constructeur. Cette classe abstraite doit déclarer et implanter une méthode void finTransmission() qui fermera les flots d'entrée et de sortie après la fin de transmission.

    Je vois pas comment une classe abstraite peut avoir un constructeur?...

    la classe InputStream est abstraite aussi mais dans la doc java j'ai trouvé qu'elle contient un constructeur expliquez moi svp...

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Il n'y a aucun problème. Une classe abstraite peut avoir un/des constructeur(s).

    Simplement, ce constructeur ne peut être appelé directement. Mais il peut être appelé par le constructeur d'une classe fille. Voici un exemple :

    Voilà le code d'une classe abstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public abstract ClasseAbstraite() {
     
        private String propriete;
     
        public ClasseAbstraite() {
            this("defaut");
        }
     
        public ClasseAbstraite(String propriete) {
            this.propriete = propriete;
        }
    }
    Il est interdit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClasseAbstraite ca = New ClasseAbstraite();
    Une classe abstraite ne peut en effet pas être instanciée directement (par définition).

    En revanche, les constructeurs sont utilisables par une sous-classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class ClasseConcrete extends ClasseAbstraite {
     
        public ClasseConcrete() {
            // Appel implicite du constructeur de la classe abstraite, qui va 
            // positionner "propriete" à "defaut" !!!
        }
     
        public ClasseConcrete(String propriete) {
            super(propriete); // appel explicite au constructeur de la classe abstraite    
        }
    }
    Cette fois, il est possible d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClasseAbstraite ca = new ClasseConcrete();
    Mettre des constructeurs dans une classe abstraite peut donc avoir un intérêt ! De même (dans des rares cas) que la création de classes abstraites n'ayant pourtant aucune méthode abstraite (c'est licite).

  3. #3
    Membre habitué Avatar de zemzoum89
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    373
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 373
    Points : 131
    Points
    131
    Par défaut
    Ok merci beaucoup pour votre aide...

    La j'ai définit une méthode non abstraite dans une classe abstraite et je lui ai affecté deux paramètre 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
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
     
    abstract class  Copieur {
    // Constructeur vide
       Copieur (){}
     
     
       //constructeur pleins au as
       Copieur (InputStream in, OutputStream out){
     
       }
    public void transmet (){
                byte[] buf = new byte[8];
     
     
                    try {
                        while(in.read(buf) >= 0)
                              {
     
                                out.write(buf);       
     
                              }
                    } catch (IOException e) {
     
                        e.printStackTrace();
                    }
     
    }
    public void finTransmission(FileInputStream in, FileOutputStream out){
    try {
        in.close();
    } catch (IOException e) {
     
        e.printStackTrace();
    }
    out.close();
    }
     
    //fin de la classe copieur...
    }

    mais mon objet InputStream et OutPutStream ne sont pas déclaré dans ma calsse, la solution est de les déclarer dans ma classe mais moi je voudrai ultérieurement remplacer mon OutPutStream par une socket dans une classe qui hérité de celle-ci et dans ce cas la j'aurai un probleme comment faire svp

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    tu declares une classe abstraite Copieur

    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 AbstractCopieur {
     
    protected String inputFilename;
     
    protected String outputFilename;
     
    public AbstractCopieur(String in, String out){
    inputFilename =in;
    outputFilename = out;
    }
     
    public abstract void transmet();
     
    public abstract void finTransmission();
    }
    et ta classe fille CopieurFichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public final class CopieurFichier extends AbstractCopieur {
     
    // et ici tu definis ton constructeur
    public CopieurFichier(String inputFilename, String outputFilename){
    super(inputFilename, outputFilename);
    }
    // et les methodes transmet et fin transmission
    ....
    }
     
    }
    et tu instancies ensuite ta classe CopieurFichier, et mieux tu mets une interface au dessus de tout ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ICopieurFichier copier = new CopieurFichier("in.txt","out.txt");
    et tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    copier.transmet()
    copier.finTransmission()
    c'est un exemple, mais en fait l'idée, c'est que tu as differentes facons de copier un fichier, mais c'est masqué par la classe abstraite voir l'inferface

    si demain tu veux utiliser un SpecialCopieurFichier, dans ta classe tout est masqué, tu feras juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ICopieurFichier copier = new SpecialCopieurFichier("in.txt","out.txt");
    et tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    copier.transmet()
    copier.finTransmission()
    la classe abstraite, elle permet de groupes de attributs communs aux classes filles, et d'implementer ou non des methodes communes aux classes filles
    tu peux definir une methode dans une classe abstraite, puis la surcharger dans sa classe fille

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

Discussions similaires

  1. comment faire une classe avec des contrôles?
    Par jffaber dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/08/2008, 16h19
  2. Comment faire une classe avec deux form?
    Par Mickey.jet dans le forum Delphi
    Réponses: 10
    Dernier message: 04/07/2006, 18h23
  3. Comment faire une requete liée avec une requete ?
    Par DavidDeTroyes dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/04/2006, 13h18
  4. Comment faire une API Win32 avec C++ Builder
    Par Zerocool003 dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/01/2006, 16h13
  5. Réponses: 10
    Dernier message: 30/06/2004, 13h00

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