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 :

probleme de classe de base


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut probleme de classe de base
    Bonjour et tout d'abord bonne année 2010 à tous...
    Je voudrais utiliser une classe de base et des classes filles et ai un problème de compréhension.

    Par exemple j'ai crée une classe de base (basetestclass avec un champ field1: integer) et 2 filles classA et classB avec leurs constructeurs qui appelent le constructeur de la mere (inherit create).

    Je crée objA et objB instances de classA et classB.
    si je fais:
    objA.field1 := 2;
    objB.field1 := 3;

    field1 n'est pas le même dans objA et dans obj2.
    Cela voudrait dire que 2 classes meres (basetestclass) différentes ont été instanciées.
    J'avais pensé que les 2 classes filles pouvaient partager les éléments de la classe mère. Ce qui n'est pas le cas ici.
    Comment faire pour que les 2 filles pouvaient partager les mêmes champs.

    Merci pour votre patience et réponse,

    Fred

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 704
    Points : 5 323
    Points
    5 323
    Par défaut
    Comme tu le dis, tu crée deux objet différents, par conséquent les propriété de de l'un de ces objets peuvent être changés sans que cela n'affecte l'autre.

    Chaque classe héritant de la classe mère à accès à la propriété Field1, puisque justement elle est héritée.

    Autrement dit, tu ne peux pas empecher de mettre une valeur différente dans Field1 de l'un et l'autre objet dans l'instanciation de la classe. Par contre tu peux l'empecher dans l'utilisation de l'objet. Il suffit de déclarer Field1 dans la classe meère en privé et de passer par une procedure of object pour modifier la valeur

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Tu peux le gérer avec des variables de classes (en fonction de ta version de Delphi).
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Merci à tous les 2.
    J'utilise DELPHI 2010 pro.

    Pourrais-tu me montrer comment faire ?

    Merci d'avance,

    Fred

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Apparemment avec class var (je n'ai que Delphi 7, donc je ne peut pas trop tester).

    http://edn.embarcadero.com/article/34324
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    je ne comprend pas ce que tu cherche à faire :

    Field1 doit être un champs commun (même espace memoire) pour tout les descendants ?

    ta déclaration ressemble à cela ? :

    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
    type
      TBaseClass = class
      private
        fField : integer;
      public
        property Field : integer read fField write fField;
        constructor Create; virtual;
      end;
     
      TClassA = class(TBaseClass)
      public
        constructor Create; override;
      end;
     
      TClassB = class(TBaseClass)
      public
        constructor Create; override;
      end;

    sinon on peu faire cela :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    program Project8;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils;
     
     
    type
      TBaseClass = class;
     
      TFields = class
      private
        fRefCount : integer;
        fField2   : integer;
        fField1   : integer;
      public
        property Field1   : integer read fField1 write fField1;
        property Field2   : integer read fField2 write fField2;
        property RefCount : integer read fRefCount;
     
        procedure Assign(Src: TFields);
     
        constructor Create; overload; virtual;
        constructor Create(const aField1, aField2: integer); overload; virtual;
        destructor Destroy; override;
      end;
     
      TBaseClass = class
      private
        fFields: TFields;
        procedure SetFields(const Value: TFields);
      protected
        function GetTraitment: integer; virtual;
      public
        property Fields    : TFields read fFields write SetFields;
        property Traitment : integer read GetTraitment;
     
        constructor Create(aFields: TFields); virtual;
        destructor Destroy; override;
      end;
     
      TClassA = class(TBaseClass)
      protected
        function GetTraitment: integer; override;
      end;
     
      TClassB = class(TBaseClass)
      protected
        function GetTraitment: integer; override;
      end;
     
     
    { TFields }
     
    procedure TFields.Assign(Src: TFields);
    begin
      if assigned(Src) then
      begin
        fField1 := Src.fField1;
        fField2 := Src.fField2;
      end;
    end;
     
    constructor TFields.Create;
    begin
      fRefCount := 0;
      fField1   := 0;
      fField2   := 0;
    end;
     
    constructor TFields.Create(const aField1, aField2: integer);
    begin
      Create;
      fField1 := aField1;
      fField2 := aField2;
    end;
     
    destructor TFields.Destroy;
    begin
      assert(fRefCount = 0, 'Erreur : des objets références encore cette classe.');
     
      inherited;
    end;
     
    { TBaseClass }
     
    constructor TBaseClass.Create(aFields: TFields);
    begin
      fFields := aFields;
      assert(assigned(aFields), 'Erreur : aFields doit être assigné.');
      inc(fFields.fRefCount);
    end;
     
     
    destructor TBaseClass.Destroy;
    begin
      if Assigned(fFields) then
        dec(fFields.fRefCount);
     
      inherited;
    end;
     
    function TBaseClass.GetTraitment: integer;
    begin
      assert(Assigned(fFields), 'Erreur : champs non assignés!');
      result := 0;
    end;
     
    procedure TBaseClass.SetFields(const Value: TFields);
    begin
      fFields.Assign(Value);
    end;
     
    { TClassA }
     
    function TClassA.GetTraitment: integer;
    begin
      inherited;
      result := fFields.Field1 + fFields.Field2;
    end;
     
    { TClassB }
     
    function TClassB.GetTraitment: integer;
    begin
      inherited;
      result := fFields.Field1 - fFields.Field2;
    end;
     
     
     
     
    var
      Fields : TFields;
      CA, CB : TBaseClass;
    begin
      Fields := TFields.Create(10, 10);
      CA := TClassA.Create(Fields);
      CB := TClassB.Create(Fields);
      try
        CA.Fields.Field1 := 20;
        CB.Fields.Field2 := 30;
     
        writeLn('Reference count : ', Fields.RefCount);
        writeLn('Field 1 value   : ', Fields.Field1);
        writeLn('Field 2 value   : ', Fields.Field2);
        writeLn;
        writeLn('Class A result  : ', CA.Traitment);
        writeLn('Class B result  : ', CB.Traitment);
        writeLn;
     
        readLn;
      finally
        CB.Free;
        CA.Free;
        Fields.Free;
      end;
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Merci "Dr WHO",
    Mon utilisation de ces classes est long à expliquer mais, j'ai testé le premier exemple que tu m'as donné et il me convient.
    J'ai initialisé "Field" dans le constructeur de la classe de base.
    2 classes filles utilisent la même valeur de "Field". Mais il ne faut pas faire ceci:
    IcA.Field := 5 (IcA, IcB = instantiations des 2 classes filles) car, dans ce cas cette valeur ne se répercute pas sur IcB.Field. Je voudrais que "Field" devienne comme une variable globale: si je la modifie dans une des 2 classes, elle le sera dans l'autre.

    J'espère que j'ai été clair..

    Merci d'avance,

    Fred

  8. #8
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    alors regarde le deuxieme exemple, qui permet d'avoir une class A et B qui utilise la même instance d'un objet TField.

    ce qui permet de créer un TField comun à A et B ou un TField unique pour chaque classe A et B
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Il n'y a que 2 solutions, il me semble: soit celle de Dr. Who (avec création de l'objet en externe), soit les variables de classes (ou pour les versions inférieures aux Delphi 20xx, un mécanisme les simulant, qui est dans la FAQ).

    Je ne connais pas le mécanisme d'initialisation des variables de classes, n'ayant pas delphi 20xx.
    je pense que ça donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type
      TBaseClass = class
      private
        class var
          fField : integer;
      public
        class property Field : integer read fField write fField; // default 0; Je ne sais pas si ça marchera
        constructor Create; virtual;
      end;
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut
    Je vous remercie "Linkin" et "Dr Who".
    Je vais tester vos idées demain à tête reposée.
    De plus, j'avais une question concernant la classe de base.
    Si je ne dis pas de bétise, dans ce que l'on a vu précédemment, la classe fille s'instantiait en instanciant du même coup la classe de base (inherited create).
    Comment récupérer cette instanciation (quel est son nom par exemple ?) ?
    Existe-t-elle effectivement ?
    C'est ptêt une question idiote.

    Merci de répondre à mon élucubration...

    Fred

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Il faut que tu révises la programmation objet .

    Tes classes "filles" n'ont fait qu'ajouter des caractéristiques à la classe parente, mais à l'arrivée, tu ne crées bien que des "filles".

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

Discussions similaires

  1. [probleme] classe de base non définie
    Par aswat dans le forum C++
    Réponses: 14
    Dernier message: 23/02/2007, 20h42
  2. Problem d'accès à la base Access : Error 80004005
    Par lord_paco dans le forum ASP
    Réponses: 2
    Dernier message: 03/06/2004, 23h18
  3. Probleme S/ UPDATE : ADOQUERY base = .DBF , D7
    Par bzh56 dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/02/2004, 01h56
  4. Probleme de classe CComplex
    Par Balls dans le forum MFC
    Réponses: 7
    Dernier message: 13/02/2004, 10h55
  5. [LG]probleme de lecture de base de données
    Par jf dans le forum Langage
    Réponses: 14
    Dernier message: 26/06/2003, 15h57

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