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 :

Classe non instantiable


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Points : 220
    Points
    220
    Par défaut Classe non instantiable
    Bonjour,

    Je travaille avec Delphi 2009.

    Je suis amené à créer un ensemble de classes qui ont toutes 3 propriétés en communs. Comme je ne veux pas réécrire 36 fois le même code, j'ai tout de suite pensé à une classe mère et des classes filles.

    A la phase de conception, je me suis dit que j'allais utiliser une classe abstraite comme classe mère. Elle ne serait pas instantiable et permettrait de transmettre les propriétés communes avec leurs Getters/setters.

    Mais je ne savais pas que les classes abstraites de Delphi sont instantiables (contrairement à celles de Java).

    Donc voila ma question, il y a-t-il un moyen de rendre une classe non instantiable en Delphi ?

    D'avance merci,
    Elverion
    Vous n'arrivez pas à faire ce que vous voulez avec Linux?
    Read The Fine Manual !==>The Linux Documentation Project

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par Elverion Voir le message
    Donc voila ma question, il y a-t-il un moyen de rendre une classe non instantiable en Delphi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TBaseClass = class abstract(TObject)
    private
      // ...
    public
      // ...
    end;
    Ce que, au passage, je n'ai jamais utilisé.

    @+ Claudius

  3. #3
    Membre actif
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Points : 220
    Points
    220
    Par défaut
    Bonjour,

    Tout d'abord, merci de m'avoir répondu.

    Mais je doit mal faire quelque chose car les classes que j'écris sont instantiables.

    Voila un exemple que j'ai fait:

    Une petite définition de classe abstraite:
    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
     
    type
      TTestAbstract = class abstract(TObject)
        private
          Field: string;
        public
          function GetField(): string;
          procedure SetField(pField: string);
      end;
     
    implementation
     
    function TTestAbstract.GetField():string;
    begin
      Result := Field;
    end;
     
    procedure TTestAbstract.SetField(pField: string);
    begin
      Field := pField;
    end;
    Et l'execution associée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var
      wTestAbs: TTestAbstract;
    begin
      try
        wTestAbs := TTestAbstract.Create;
        wTestAbs.SetField('BLABLA');
        ShowMEssage(wTestAbs.GetField);
      except
        on E:Exception do
          Writeln(E.Classname, ': ', E.Message);
      end;
    end.
    Et sur ma machine (Delphi 2009 sous Codegear sous Windows XP), ça s'execute et un message avec 'BLABLA' s'affiche.

    Est ce que j'ai oublié de faire quelque chose ?

    D'avance merci,
    Elverion
    Vous n'arrivez pas à faire ce que vous voulez avec Linux?
    Read The Fine Manual !==>The Linux Documentation Project

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est fort ce que tu racontes !
    Dans Classes et objets (Delphi)


    Si une classe est marquée abstract, elle ne peut pas être directement instanciée en utilisant le constructeur Create. Une classe entière peut être déclarée abstract même si elle ne contient aucune méthode virtuelle abstraite.
    Je viens de tester sur XE, j'ai le même soucis !
    Cela ne fonctionne absolument pas !
    J'ai placé mon code dans un projet VCL dans le OnClick d'un TButton !
    Ton code étant semble-t-il dans une application console ?

    On aurait pu s'attendre à l'erreur E2402
    comme le fait remarqué Laurent Dardenne dans son article
    Les possibles évolutions du langage Delphi 2006
    Regression ou uniquement .NET ?

    J'ai ajouté une méthode "virtual abstract", on obtient un petit warning W1020
    et la EAbstractError se produit au moment de l'appel de la fonction

    En attendant des jours meilleurs !
    Si ton ancêtre reste le TObject, tu peux modifier ta classe comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      TTestAbstract = class abstract(TObject)
        private
          FField: string;
        protected
          function GetField(): string;
          procedure SetField(Value: string);
        public
          constructor Create; virtual; abstract;
     
          property Field: string read GetField write SetField;
      end;
    Si tu dois utiliser un ancêtre comme le TComponent, pour conserver l'accès au inherited create, faudrait mettre une autre méthode abstraite,
    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
     
    type
      TTestAbstract = class abstract(TComponent)
        private
          FField: string;
        protected
          function GetField(): string;
          procedure SetField(Value: string);
     
          procedure CheckCanCreate(); virtual; abstract;
        public
          constructor Create(AOwner: TComponent); override;
     
          property Field: string read GetField write SetField;
      end;
     
      TTestAbstractHerited = class(TTestAbstract)
      end;
     
    constructor TTestAbstract.Create(AOwner: TComponent);
    begin
      CheckCanCreate();
      inherited Create(AOwner);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,
    Citation Envoyé par ShaiLeTroll Voir le message
    Je viens de tester sur XE, j'ai le même soucis !
    Cela ne fonctionne absolument pas !
    Effectivement j'ai fait le test sous D2009, et force est de constater que la présence du mot clé abstract n'a absolument aucun effet.

    Apparemment ce bug existe depuis D2006: voir Keyword "abstract" for classes does not work in D2006.pro.win32.

    Donc l'astuce de Shai reste, semble-t-il, la seule solution.

    @+

  6. #6
    Membre actif
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Points : 220
    Points
    220
    Par défaut
    Merci beaucoup pour vos réponses.

    Je vais donc me contenter de la solution de secours en espérant que ce problème soit réglé un jour ou l'autre.

    Elverion
    Vous n'arrivez pas à faire ce que vous voulez avec Linux?
    Read The Fine Manual !==>The Linux Documentation Project

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

Discussions similaires

  1. [ToutlookApplication] Classe non enregistrée
    Par nico33410 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/08/2005, 10h36
  2. [Plugin] Classe non trouvée au runtime
    Par toto_toto dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 15/02/2005, 10h36
  3. [debutant][Classpath][Linux] Classe non trouvée
    Par oghma777 dans le forum Général Java
    Réponses: 5
    Dernier message: 15/10/2004, 21h26
  4. Réponses: 4
    Dernier message: 07/06/2004, 13h34
  5. [Config] Classes non trouvées
    Par newfsch dans le forum JBuilder
    Réponses: 2
    Dernier message: 27/01/2004, 21h12

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