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 :

Cloner un objet : comment créer l'instance ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut Cloner un objet : comment créer l'instance ?
    Bjr,

    Si j'ai les objets suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TMain = class(TObject)
    public
      constructor Create(AOwner : TMain);
      function Assign(Source : TMain); virtual;
      function Clone : TMain;
    end;
     
     
    TDerive = class(TMain)
    public
      function Assign(Source : TMain); override;
    end;
    Comment implémenter la méthode Clone suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TMain.Clone : TMain;
    begin
      Result := .......Create(nil);  <== Pb ici
      Result.Assign(Self);
     
    end;
    Je veux bien sûr pouvoir cloner n'importe quel instance dérivée de TMain.

    Comment faire ?
    De plus le constructeur Create de TMain doit-il être virtuel ?

    Merci

    @+
    Php
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := (self.ClassType).Create(nil);
    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 !

  3. #3
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Il faut passer par une référence de classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TMainClass = class of TMain;
    Puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TMain.Clone: TMain;
    begin
      result := TMainClass(self.ClassType).Create(self.owner);
    end;
    Le constructeur doit être virtuel

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ?!?

    J'ai zappé qque chose ? ou un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Result := TDeriveDeTMain.Create;
    Ne suffit pas ?

    J'ai pourtant deja creer des objets d'un type et affecté a un type parent ...

    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Var MainTemp : TMain;
    Begin
    MaintTemp := TDevive.create;
    Result := MaintTemp;
    Ca aussi devrais marcher .....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bsr,

    Oui TDerive.Create fonctionne qd tu sais à l'avance que tu clones un TDerive, dans mon cas il peut s'agir d'un objet quelconque pouvu que
    l'objet vérifie MonObjet.InheritsFrom(TMain)

    ok en passant par une référence de classe c'est bon. Cool 8)

    Merci

    @+
    Php
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  6. #6
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par Clorish
    ?!?

    J'ai zappé qque chose ? ou un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Result := TDeriveDeTMain.Create;
    Ne suffit pas ?
    Si tu fais ça, il faudra redéfinir la méthode Clone dans toutes les classes dérivées, alors qu'avec la référence de classe (et le constructeur virtuel), la méthode Clone ne doit être définie que dans la classe de base, elle marchera pour toutes les sous-classes (sauf si une sous-classe a un constructeur différent, dans ce cas il faudra redéfinir clone à son niveau).

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  7. #7
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Chouette merci Bloon j'ai appris quelque chose ce soir !

    *sort Delphi 7 Studio de sa table de chevet pour en savoir plus* 8)
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  8. #8
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Si tu veux apprendre des trucs aujourd'hui, je te recommande ce tuto :

    http://laurent-dardenne.developpez.c...es/metaclasse/



    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  9. #9
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    lol merci je prends note, parce que mon dans mon sioupeur bouquin j'ai pas trouvé "référence de classe" !
    Faudra que je regarde à "métaclasse" ^^

    bonne prog' !
    Bestiol.
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/09/2007, 15h26
  2. [oracle10g] comment créer plusieurs instances
    Par Loïck dans le forum Oracle
    Réponses: 2
    Dernier message: 16/02/2007, 08h49
  3. Réponses: 5
    Dernier message: 17/07/2006, 18h34

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