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

Delphi Discussion :

Delphi 6 Programmation Objet


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut Delphi 6 Programmation Objet
    Salut tout le monde,

    Je fais un prog Objet sous Delphi sur les astres et j'ai une petite question :
    J'ai des objets Planete et des objets Satellite. Une planete possède un ou plusieurs satellites. J'ai donc une propriété dans ma classe Planete nommée 'mesSatellite' qui est une collection de satellites.
    Donc est ce que je dois mettre une propriété 'planete' dans la classe Satellite pour savoir à quelle planète est lié le satellite?

    Nb: J'enregistre tous les astres créés (planetes et satellites) dans une classe nommée CollectionAstres

    Je vous remercie d'avances pcq là, je suis vraiment pommé

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Donc est ce que je dois mettre une propriété 'planete' dans la classe Satellite pour savoir à quelle planète est lié le satellite?
    C'est possible, mais pas forcément nécessaire.
    La différence entre les 2 classes c'est que les satellites seront alloués dans leur planéte, tandis que la planète sera simplément affectée dans à la variable planète de chaque satellite.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure Planete.AddSatellite(Nom_de_satellite:string) ;
    var NewSatellite :  Satellite ;
    NewSatellite=Satelitte.Create ; 
    NewSatellite.Name=Nom_de_satellite
    NewSatellite.Planete=Self ;
    Sattellites.add(NewSattelite)

  3. #3
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Tout dépend de ce que tu veux faire avec ta classe. La programmation objet n'est qu'un style de programmation parfois très utile, mais qui en soi ne résout rien automatiquement, et certainement pas les choix auxquels est confronté le développeur..

    Si tu veux pouvoir retrouver rapidement à quelle planète un satellite particulier appartient, alors oui, tu as intérêt à créer une variable "Planète" dans la classe Satellite, pour éviter d'avoir à utiliser dans ton programme une boucle qui, à chaque fois, devra parcourir la liste complète de toutes les planètes pour retrouver la bonne... à ta place, je créerais ce champ "Planete" quand même à toutes fins utiles.

    Par ailleurs, stocker les satellites dans CollectionAstres fait à mon avis double usage, puisque les satellites sont déjà stockés dans la collection des satellites de chaque planète. Moi je ne stockerais que les Planètes dans cette variable générale. Question de rigueur et donc de fiabilité du code.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut
    Merci beaucoup pour vos réponses! C'est vraiment sympa!
    Mais je bloque quand même car tous les astres que je créée (planètes + satellites) (ces 2 classes héritant de la classe astre) sont ajoutés à la classe CollectionAstres.
    J'ai donc ensuite, pour retrouver mes satellites, créé une propriété 'mesSatellites' dans la classe Planète afin de retrouver rapidement les satellites de la planète
    Mais là je veux faire le contraire (retrouver la planète en fonction d'un satellite) et c'est donc pour simplifier (éviter de faire des boucles) que j'ai voulu créé une propriété 'planeteAssociee' dans la classe Satellite
    Mais quand je fais ça, j'ai un 'circular unit references' qui m'embête vu que j'utilise ces 2 classes mutuellement...
    Ouf! C'est dur à expliquer mais bon je vous assure que ça veut dire qqch!
    En espérant que vous ayez compris
    Merci encore pour vos réponses

  5. #5
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Il suffit de définir les deux classes (enfin, les trois avec Astres) dans la même unité au lieu d'utiliser des unités différentes... on n'est pas obligé d'utiliser une unité pour chaque classe.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut
    C'est ce que j'ai demandé à mon cher professeur à la science infuse qui m'a répondu catégoriquement qu'il fallait ABSOLUMENT une classe par unité Y parait que c'est indispensable pour l'exam' Bon ben si y'a vraiment pas de solution je vais pas faire de propriété planète dans la classe Satellite...Je vais encore cherché un peu mais bon
    Merci beaucoup

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par eultartuffe
    C'est ce que j'ai demandé à mon cher professeur à la science infuse qui m'a répondu catégoriquement qu'il fallait ABSOLUMENT une classe par unité Y parait que c'est indispensable pour l'exam'
    Certainement pour éviter la facilité des classes "amies"
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 5
    Par défaut
    Bonjour,

    Tu as une autre solution, tu mets la clause Uses dans la partie implementation et hop plus de références circulaires

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut
    Pedro, c'est quoi les classes "amies" stp?
    Et neorun, j'ai essayé de faire ça mais regarde :
    Code de la classe Satellite :
    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
     
    unit Satellite;
     
    interface
     
    uses Astre;//, Planete;
     
    type
       TSatellite =
          class(TAstre)
          private
             pesanteur : Single;
          public
             procedure setPesanteur(pp_Pesanteur: Single);
             function getPesanteur : Single;
             //procedure setPlanete(pp_Planete : TPlanete);
             //function getPlanete : TPlanete;
             constructor Create(pc_Nom : String; pc_HH, pc_MM, pc_SS : Byte;
                                pc_Declinaison : Shortint;
                                pc_Distance : Integer;
                                pc_Diametre : Integer;
                                pc_Masse : Double; pc_Image : String;
                                pc_Pesanteur : Single);
       end;
    Code de la classe Planete :
    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
     
    unit Planete;
     
    interface
     
    uses Astre, CollectionAstres, Satellite;
     
    type
       TPlanete =
       class(TAstre)
          private
             pesanteur : Single;
             mesSatellites : TCollectionAstres;
          public
             procedure setPesanteur(pp_Pesanteur: Single);
             function getPesanteur : Single;
             procedure ajouterSatellite(pp_Satellite : TSatellite);
             function getUnSatellite(pf_NomSatellite : String) : TSatellite;
             constructor Create(pc_Nom : String; pc_HH, pc_MM, pc_SS : Byte;
                                pc_Declinaison : Shortint;
                                pc_Distance : Integer;
                                pc_Diametre : Integer;
                                pc_Masse : Double; pc_Image : String;
                                pc_Pesanteur : Single;
                                pc_MesSatellites : TCollectionAstres);
       end;
    En fait, j'utilise la classe Planete dans la déclaration de la classe Satellite et vice versa

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 5
    Par défaut
    De cette manière tu n'as plus de références circulaires

    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
     
    unit Satellite;
     
    interface
     
    uses
      Astre, Planete;
     
    type
      TSatellite = class(TAstre)
      public
        maPlanete: TPlanete;
      end;
     
    implementation
     
    end.
    et

    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
     
    unit Planete;
     
    interface
     
    uses
      Astre;
     
    type
      TPlanete = class(TAstre)
      public
        procedure AddSatellite(Satellite: TAstre);
      end;
     
    implementation
     
    uses
      Satellite;
     
    { TPlanete }
     
    procedure TPlanete.AddSatellite(Satellite: TAstre);
    begin
      with (Satellite as TSatellite) do
      begin
     
      end;
    end;
     
    end.
    Bon code

  11. #11
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par eultartuffe
    Pedro, c'est quoi les classes "amies" stp?
    C'est très simple:
    Tu as 2 classes dans la même unité avec chacune des membres en private. Eh bien elles sont amies: elles peuvent lire dans les membres déclarés private de l'autre classe Alors qu'une classe dans une autre unité ne pourra pas les lire
    Je pense que c'est pour te forcer à présenter correctement ton code et à penser tes public/published de façon la plus judicieuse possible

    Note: La mention strict private des nouvelles versions de Delphi les cache complètement y compris pour les classes amies.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut
    Donc il faut déclarer la classe TPlanète 2 fois pour remédier au problème? Je comprend pas l'intérêt de la déclarer 2 fois... (je suis reparti en cours je reviens ce soir)
    En tout cas merci à vous tous

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 5
    Par défaut
    Excuse moi mais le code que j'ai posté plus haut est faux, je te reposte le bon dans 1 minute

    Edit: Voila, l'erreur est réparée tu n'auras pas de souci cette fois :p

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut
    Merci Pedro pour ta précision sur les classes amies, je connaissais pas du tout.
    Sinon pour reprendre sur mon problème, neorun, dans la classe Satellite que m'as transmise, il doit y avoir une propriété en private 'maPlanete' (planete associée au satellite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    uses Astre;//, Planete;
     
    type
       TSatellite =
          class(TAstre)
          private
             pesanteur : Single;
             maPlanete : TPlanete;
          public
             procedure setPesanteur(pp_Pesanteur: Single);
             function getPesanteur : Single;
             .....
       end;
    mais comme la classe Satellite n'est pas mise dans le uses de l'interface, ça ne marche pas (et vice versa pour la classe Planete si on fait le contraire)

  15. #15
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Hmm... je soupçonne fort ce prof de vouloir vous faire réfléchir à la notion d'héritage.
    Réfléchis donc à cette question : "qu'est-ce qu'un satellite ?".

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 54
    Par défaut
    euuh...ben un satellite c'est un astre (tout comme une planete) qui correspond à une et une seule planète...non?

  17. #17
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 003
    Par défaut
    Personnellement, je te conseille d'étuider le TComponent et ses propriétés Owner et Components/ComponentCount, ... idem avec TControl et Parent, Controls/ControlCount ...

    et si par Hasard, un TComponent est un Astre, pouf bada boum ... et au lieu de mettre un satellite dans la collection des astres (la globale) tu l'ajoute dans la collection des astres d'une planète ... et puis, tu peux pourrir la vie à ton prof, tu fais les systèmes solaires, les bras, les galaxies, les amas, ... tout ça c'est des collections ... ou une hiérarchisation, dans ce cas tu peux étudier le TTreeNodes (c'est comme l'arbre de l'explorateur Windows)

    Ensuite, les professeurs, lol, en java, une 'unité' pour une classe, oui, c'est pour déploiement, le packaging, j'en ai fait à l'école, donc je suis pas allez bien loué, ..., en Delphi, lol, ton prof, il n'a jamais ouvert Classes.pas (la meilleure référence c'est quand même le code delphi lui même) ... mais bon mes profs était bien scandalisé par un break dans un for, soit disant le while c'est plus beau dans ce cas, lol, du coup, je faisais des sous fonctions avec au lieu d'un break, je mettais un exit, et là, ils n'était pas d'accord non plus , alors je sortais le code de TStrings.IndexOf, et pouf silence ...
    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

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 5
    Par défaut
    eultartuffe, le code que j'ai posté marche parfaitement en utilisant les notions d'héritage, le membre maPlanete existe bien dans Satellite et la fonction AddSatellite existe bien dans la classe Planete.

    Soit il manque quelque chose et je n'ai pas compris quoi :p

    Soit tu n'as pas relu le code (que j'ai modifié au passage comme dit dans mon précédent poste)

    Voilou

  19. #19
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Citation Envoyé par eultartuffe
    euuh...ben un satellite c'est un astre (tout comme une planete)
    Et ben tu as ta réponse !

    Une variable objet n'a pas besoin d'être strictement du type de l'objet qu'elle contient, elle peut être d'un type ancêtre...

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

Discussions similaires

  1. [Débuter] Programmation objet mais conditions particulières
    Par KaptainouK dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 30/09/2005, 00h20
  2. [Débutant(e)][Conception] prob de programmation objet
    Par gregorian dans le forum Général Java
    Réponses: 3
    Dernier message: 07/07/2005, 11h20
  3. Questions sur la programmation objet en Delphi
    Par Manopower dans le forum Débuter
    Réponses: 20
    Dernier message: 15/06/2005, 15h39
  4. [ASP] Programmation objet ?
    Par Hell dans le forum ASP
    Réponses: 6
    Dernier message: 07/04/2005, 15h28
  5. Problème programmation objet
    Par Contrec dans le forum MFC
    Réponses: 54
    Dernier message: 30/03/2005, 11h30

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