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

Lazarus Pascal Discussion :

Erreur d'implémentation non trouvée pour des méthodes abstraites d'un generic ! [Free Pascal]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 30
    Points
    30
    Par défaut Erreur d'implémentation non trouvée pour des méthodes abstraites d'un generic !
    A la compilation j'ai le message d'erreur suivant : "Forward declaraton not solved" pour les méthodes abstraites déclarées dans le type générique GDBConnection ! Le code ci-dessous montre seulement la partie déclaration des objets. Il existe une implémentation pour chaque méthode de la classe TDBConnection, mais aucune pour le générique puisque toutes sont abstraites.

    Je ne comprends pas d'où provient le problème ... (J'utilise Lazarus 1.4.4 avec Free Pascal Compiler version 2.6.4+dfsg-4)


    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
    // **************************************************************
    // **************************************************************
    generic GDBConnection<C,T> = class
    protected
       function rConnection : C; virtual; abstract; // Error forward decalration not solved !
       function rTransaction : T; virtual; abstract; // Error forward decalration not solved !
    public
      constructor Creer(databaseName : String); virtual; abstract; // Error forward decalration not solved !
      destructor  Detruire; virtual; abstract; // Error forward decalration not solved !
      procedure Connecter; virtual; abstract; // Error forward decalration not solved !
      procedure Deconnecter; virtual; abstract; // Error forward decalration not solved !
      property Connection : C read rConnection; // Error forward decalration not solved !
      property Transaction : T read rTransaction; // Error forward decalration not solved !
      procedure TrCommencer;virtual; abstract; // Error forward decalration not solved !
      procedure TrValider; virtual; abstract; // Error forward decalration not solved !
      procedure TrAnnuler; virtual; abstract; // Error forward decalration not solved !
    end;
     
    // **************************************************************
    TSQLiteDBConnection = specialize GDBConnection<TSQLite3Connection, TSQLTransaction>;
     
     
    // **************************************************************
     TDBConnection = class(TSQLiteDBConnection)
    private
      db : TSQLite3Connection; {La connection }
      tr : TSQLTransaction; {La transaction }
    protected
       function rConnection : TSQLite3Connection; override;
       function rTransaction : TSQLTransaction;   override;
    public
      constructor Creer(databaseName : String); override;
      destructor  Detruire; override;
      procedure Connecter;   override;
      procedure Deconnecter; override;
      procedure TrCommencer; override;
      procedure TrValider; override;
      procedure TrAnnuler; override;
      end;

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Euh, ici c'est le forum francophone. Pourquoi rédiger votre question en anglais ?

    Donc, sans vouloir vous commander, ce serait bien de mettre le titre et le corps du message en français.

    Cela dit, votre problème me dépasse : pour moi c'est de l'hébreu. Donc je laisse la parole à des personnes plus compétentes.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    salut

    +1 pour la remarque de Roland

    question simple: as-tu implémenter les méthodes concrètes de TDBConnection ? dans ce cas, essaie à nouveau avec des méthodes vides.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Je ne connais pas bien les génériques, mais ce que j'ai rapidement lu, notamment ici ne me laisse pas penser que les génériques peuvent s'utiliser ainsi.

    Ici, il me semble que tu es plus dans le champ de classes de base ou d'interfaces.:
    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
    type TDBConnection = class
    protected
       function rConnection : TinternalDBConnection; virtual; abstract; // ancêtre des TSQlite3Connection, TOracleConnection, etc
       function rTransaction : TDBTransaction; virtual; abstract; // idem
    public
      constructor Creer(databaseName : String); virtual; abstract; // Error forward decalration not solved !
      destructor  Detruire; virtual; abstract; // Error forward decalration not solved !
      procedure Connecter; virtual; abstract; // Error forward decalration not solved !
      procedure Deconnecter; virtual; abstract; // Error forward decalration not solved !
      property Connection : C read rConnection; // Error forward decalration not solved !
      property Transaction : T read rTransaction; // Error forward decalration not solved !
      procedure TrCommencer;virtual; abstract; // Error forward decalration not solved !
      procedure TrValider; virtual; abstract; // Error forward decalration not solved !
      procedure TrAnnuler; virtual; abstract; // Error forward decalration not solved !
    end;
     
    // **************************************************************
    TSQLiteDBConnection = class(TDBConnection);
    private
      db : TSQLite3Connection; {La connection }
      tr : TSQLTransaction; {La transaction }
    protected
       function rConnection : TinternalDBConnection; override; // renverra un TSQLite3Connection, descendant de TinternalDBConnection
       function rTransaction : TDBTransaction;   override; // renverra un TSQLTransaction, descendant de TDBTransaction
    public
      constructor Creer(databaseName : String); override;
      destructor  Detruire; override;
      procedure Connecter;   override;
      procedure Deconnecter; override;
      procedure TrCommencer; override;
      procedure TrValider; override;
      procedure TrAnnuler; override;
      end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Oups... voilà, voilà c'est en français :-)

    La classe TDBConnection est bien implémentée pour l'ensemble de ses méthodes.

    GDBConnection est un type générique utilisé pour implémenter la classe adaptateur TDBConnection (du modèle de conception du même nom). Pourquoi un type générique pour servir à l'implémentation d'une classe adaptateur ? Et bien parce que la classe adaptateur a besoin d'échanger des objets typés spécifiques avec les appelants car elle ne peut as tout adapter...

    En cherchant sur Internet j'ai croisé un message de forum qui laissait entendre une erreur similaire pour laquelle il fallait chercher une solution dans une mise à jour du compilateur pascal... Avant de me lancer dans cette aventure je préférais regarder si ce n'était pas plus simplement un problème de codage...

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonsoir,

    Par curiosité, et pour apprendre, j'ai testé le code suivant sous CT 5.20, cad FPC 3.1.1
    Il compile, avec une seule erreur, mentionnée dans le 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
    type
      generic TGenericBaseClass<C,T> = class
      protected
        FTransaction: T;
        function FConnection: C; virtual; abstract;
      public
        constructor Creer(aTransaction: T); virtual; abstract;
        destructor Detruire; virtual; abstract;
        procedure Connecter; virtual; abstract;
        property Connection: C read FConnection;
      end;
     
      TDerivedClassType1 = specialize TGenericBaseClass<Cardinal, string>;
     
      TParticularClassType1 = class(TDerivedClassType1)
      public
        constructor Creer(aTransaction: string); override;
        destructor Detruire; override;
        procedure Connecter; override;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    constructor TParticularClassType1.Creer(aTransaction: string);
    begin
      inherited Create;
      FTransaction:=aTransaction;
    end;
     
    destructor TParticularClassType1.Detruire;
    begin
      inherited Destroy;
    end;
     
    procedure TParticularClassType1.Connecter;
    begin
      ShowMessage('transaction : '+FTransaction);
    end;
     
    function TParticularClassType1.FConnection: Cardinal;  // unit1.pas(79,32) Error: method identifier expected
    begin
      if FTransaction=EmptyStr
      then Result:=0
      else Result:=1;
    end;  
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
      aParticularObjectType1: TParticularClassType1;
    begin
      aParticularObjectType1:=TParticularClassType1.Creer('param');
      aParticularObjectType1.Connecter;
      ShowMessage(IntToStr(aParticularObjectType1.Connection));
      aParticularObjectType1.Free;
    end;
    Si je n'implémente pas TParticularClassType1.FConnection, j'obtiens à juste titre le message :
    unit1.pas(189,75) Warning: Constructing a class "TParticularClassType1" with abstract method "FConnection"
    et obtiens une EAbstractError à l'exécution.

    Je ne vois pas comment résoudre le problème de l'implémentation particulière de FConnection... sauf à assigner une fonction à un champ du type voulu ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    J'avais juste oublié de l'overrider !

    Le code précédent (qui colle au tien, je crois) est donc fonctionnel sous FPC 3.1.1 avec la déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      TParticularClassType1 = class(TDerivedClassType1)
      protected
        function FConnection: Cardinal; override;
      public
        constructor Creer(aTransaction: string); override;
        destructor Detruire; override;
        procedure Connecter; override;
      end;
    Il vaut probablement donc le coup de rajeunir ton FPC !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Ok, merci ! C'est bien ce que je pensais, ce doit être mon FPC qui est trop ancien... Je vais l'actualiser.

    Merci encore. Je marque le fil comme résolu.

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

Discussions similaires

  1. Erreur : Classe TStoredProc non trouvée
    Par Sunchaser dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/11/2006, 00h03
  2. ClassForName mais pour des méthodes d'un objet
    Par Shogun dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2006, 08h32
  3. bdd : erreur 3265 élément non trouvé dans cette collection
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/07/2006, 09h52
  4. Erreur de "Élément non trouvé dans cette collection"
    Par charleshbo dans le forum Access
    Réponses: 4
    Dernier message: 04/05/2006, 18h42
  5. [Debutant][Install][VS]erreur sur fichier non trouvé.
    Par silvermoon dans le forum DirectX
    Réponses: 4
    Dernier message: 16/07/2004, 20h59

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