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 Delphi Discussion :

pb constructeurs classes dérivant classe abstraite


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut pb constructeurs classes dérivant classe abstraite
    mon but est d'exécuter ce programme ci:

    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
     
    program Abstrait;
    {$APPTYPE CONSOLE}
    uses
      SysUtils,
      Affichable in 'Affichable.pas',
      Entier in 'Entier.pas',
      Flottant in 'Flottant.pas';
    var
      taAffiche: array of TAffichable;
      i: integer;
    begin
      SetLength(taAffiche, 3);
      taAffiche[0] := TAffichable.Create(3);    //constructeur TEntier 
      taAffiche[1] := TAffichable.Create(3.5); //constructeur TFlottant
      taAffiche[2] := TAffichable.Create(2);   //constructeur TEntier
      for i := 0 to high(taAffiche) do
        taAffiche[i].Affiche;          // procédure de TFlottant ou TEntier
    end.
    Mais je n'ai accès qu'au constructeur Create sans pouvoir entrer les arguments.
    Voici mes 3 classes:

    CLASSE TAffichable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    unit Affichable;
     
    interface
     
    type TAffichable = class(TObject)
     
      public
        procedure Affiche; virtual; abstract;
      end;
     
    implementation
    { TAffichable }
    end.
    Classe TEntier
    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
     
    unit Entier;
     
    interface
     
    uses Affichable;
     
    type
      TEntier = class(TAffichable)
     
      private
        valeur: integer;
      public
        constructor Create(n: integer); 
        procedure Affiche; override; //Redéfinition
      end;
     
    implementation
    { TEntier }
     
    procedure TEntier.Affiche;
    begin
      inherited;
      writeln('Je suis un entier de valeur + valeur');
    end;
     
    constructor TEntier.Create(n: integer);
    begin
      valeur := n;
    end;
    end.
    CLASSE TFlottant
    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
     
    unit Flottant;
     
    interface
     
    uses Affichable;
     
    type
      TFlottant = class(TAffichable)
     
      private
        valeur: real;
      public
        constructor Create(x: real); 
        procedure Affiche; override; //Redéfinition
      end;
     
    implementation
    { TFlottant }
     
    procedure TFlottant.Affiche;
    begin
      inherited;
      writeln('Je suis un flottant de valeur + valeur');
    end;
     
    constructor TFlottant.Create(x: real);
    begin
      valeur := x;
    end;
    end.
    J'ai voulu rajouter un constructeur dans ma classe abstraite pour pouvoir le redéfinir ou le surcharger dans les classes dérivées mais rien de concluant.

    Merci d'avançe !!

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    A priori, je dirais que ce n'est pas possible de cette manière. La solution la plus simple serait de remplacer le code de ton DPR par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      taAffiche[0] := TEntier.Create(3);    //constructeur TEntier 
      taAffiche[1] := TFlottant.Create(3.5); //constructeur TFlottant 
      taAffiche[2] := TEntier.Create(2);   //constructeur TEntier
    En fait, lorsque tu appelle le premier Create, tu ne veux pas créer une instance de TAffichable mais bien une instance de TEntier. Idem pour TFlottant.
    Une remarque, il FAUT appeler inherited dans le constructeur de tes objets descendants (même si dans ce cas précis ça ne gène pas le fonctionnement de ta classe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    constructor TEntier.Create(n: integer); 
    begin 
      inherited Create;
      valeur := n; 
    end;
    Autre remarque, il ne faut pas appeler inherited dans une méthode qui surcharge directement une méthode abstraite car celle-ci n'existe pas (pas d'implémentation):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TEntier.Affiche; 
    begin 
      writeln('Je suis un entier de valeur + valeur'); 
    end;

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci pour cette réponse et tes remarques toujours pertinentes!

    (J'ai mal retranscris mon programme initial qu'était en java )

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

Discussions similaires

  1. Hériter un constructeur d'une classe abstraite, possible ?
    Par gvdmoort dans le forum Général Java
    Réponses: 1
    Dernier message: 27/10/2013, 23h28
  2. Réponses: 4
    Dernier message: 05/11/2007, 21h02
  3. Réponses: 5
    Dernier message: 20/11/2005, 12h15
  4. Réponses: 3
    Dernier message: 06/11/2005, 19h02
  5. [Language]constructeur de sous classes
    Par seb888 dans le forum Langage
    Réponses: 12
    Dernier message: 04/06/2005, 23h37

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