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 :

Objet Query avec un héritage multiple


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut Objet Query avec un héritage multiple
    Bonjour,

    Désolé mais je n'ai pas trouvé mieux en titre.

    Voila j'e suis en train de créer un Obj qui ce connecte à n'importe quelle base, pour ce faire j'ai creé différents objets, un qui herite de BDE un autre de ADO
    un autre de IB etc...

    Jusque là tout va bien,sauf que chaque objet est quasiement le même (function, procedure, property etc...) a part les spécifité à chaque composant.

    Ce que je voudrais c'est créer un objetMaster dans lequel il aurait l'implementation de ce qui est commun en ensuite creer un "double héritage"
    un peu comme pour les interface.

    le problème c'est que lorsque j'utilise les interfaces je ne réussi pas à implémenter mes procedures, mes property, à priori normal car
    les méthodes d'une interface sont abstaites (sauf erreur de ma part)

    Voici le code shématisé

    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
     
    ObjetMaster = Class(Tcomponent) ou Interface
    	MethodeObjetMaster1(.....);Virtual;
    	MethodeObjetMaster2(.....);Virtual;
    end
     
    ObjBDE =Class(TQuery,ObjetMaster)
    	MethodeObjetMaster2(.....);override	
    	MethodeObjetBDE1(.....);override	
    end;
     
    ObjIB =Class(TIBQuery,ObjetMaster)
    	MethodeObjetMaster2(.....);override	
    	MethodeObjetIB1(.....);override	
    end;
     
    etc...
    Pouvez-vous me dire si ce que je souhaite faire est possible.

    J'ai bien trouvé la discussion suivante:

    http://www.developpez.net/forums/sho...ght=h%E9ritage

    mais si vous pouvez une autre idée je suis ok
    Cordialement
    Qays

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    delphi ne gere pas l'héritage multiple etnre objets par contre tu peux essayer de passer par une interface
    @+

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci mais comment implémenter de procedure dans une interface, je n'y arrive, il ne veut pas compiler car il semblerait que les métode d'une interface sont abstraite

    cordialement

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    L'héritage multiple n'existe pas en Delphi. Et vouloir le contourner avec des interfaces n'est jamais une bonne solution.

    Normalement, tu ne devrais pas devoir faire ce que tu veux faire. En principe, tu aurais plutôt dû avoir une classe TAncetre qui implémente les comportements communs. Avec éventuellement l'ajout de méthodes virtuelles (voire abstraites).

    Les sous-classes de cette classe utiliseront chacune un objet de la classe de BD qui leur correspond. C'est-à-dire avec une référence à cet objet - qu'ils créent et détruisent dans leurs constructeurs et destructeurs respectifs - plutôt qu'un héritage.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,


    "Voila j'e suis en train de créer un Obj qui ce connecte à n'importe quelle base"
    L'approche par les interfaces est un bonne chose à mon sens.

    Voici comment je ferais:

    D'abord je déclare une interface IDataset avec les méthodes qui m'interesse.
    Ex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      IDataset = interface
      [GUID]
        procedure Open; 
        procedure Close;  
        (...)     
      end;
    Un objet TMonDataSet qui implémente cette interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      TMonDataSet = class(TInterfacedObject, IDataset)
      (...)
      end;
    Une interface IQuery
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      IQuery = interface [GUID]
        function GetSQL: string;
        procedure SetSQL(const Value: string);
        property SQL: string read GetSQL write SetSQL;
        (...)
      end;
    Un objet TBaseQuery qui sera l'ancêtre de tous les objets Query:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      TBaseQuery = class(TMonDataSet)
      (...)
      end;
    Ensuite chaque objet Query de chaque type de base de données implémentera l'interface IQuery

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     TBDEQuery = class(TBaseQuery, IQuery)
      (...)
     end;
     
     TADOQuery = class(TBaseQuery, IQuery)
      (...)
     end;
     
     (...)
    Evidemment cet exemple de code est simple car on peut imaginer de gérer tous les objets SQL comme procédure stockée, table....

    Par exemple une interface IDatabase pourrais fournir les connexions, renvoyer des IQuery

    du coup comme c'est des interfaces, on bénéficie de la gestion automatique de la mémoire lié à ce type de donnée.

    J'espère que je suis suffisamment clair.
    a+
    Akim Merabet

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Merci de votre contribution.

    je vous ferais suivre la code mise ne place (une fois terminé)

    Cordialement

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

Discussions similaires

  1. Mapping Objet-Relationel avec JPA :héritage
    Par ahmeddrira dans le forum Frameworks Web
    Réponses: 3
    Dernier message: 06/03/2012, 17h12
  2. Héritage multiple avec la contrainte XOR :
    Par choko83 dans le forum UML
    Réponses: 10
    Dernier message: 04/06/2008, 14h29
  3. Pb de query avec héritage
    Par rdeman dans le forum JPA
    Réponses: 5
    Dernier message: 23/05/2008, 15h35
  4. type générique avec héritage multiple
    Par apqmwnqmap dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2008, 14h56
  5. Réponses: 19
    Dernier message: 13/07/2006, 13h35

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