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 :

Redéfinition de méthodes ?!


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Redéfinition de méthodes ?!
    Bonjour,

    J'ai 1 diagramme de classe ci-dessous à réaliser sous Delphi :

    classe T1
    paramètres : taille, value (type inconnu)

    classe T2_Byte héritée T1
    paramètres: taille, value avec le type BYTE

    classe T3_word héritée T1
    paramètres: taille, value avec le type WORD

    classe T4 contient 1 liste de paramètres de type T1 (générique), ça dépend de type de paramètre à ajouter dans la liste qu'on va utiliser T2_Byte ou T3_Word, cad :
    lst : array [0..10] of T1 est déclarée dans T4
    lst[1]:=T2_Byte.create;
    lst[2]:=T3_Word.create;
    ...

    Mes questions sont:
    1/ est-ce qu'il est nécessaire de déclarer 1 variable "value" de type variant dans T1 ?
    Le problème est qu'on ne peut pas afficher par exemple lst[1].value mais il faudrait faire : T2_Byte(lst[1].value)

    2/ en réalisation, pourrais-je faire comme suit :

    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
    T1=class(TObject)
    protected
    Ftaille:integer;
     
    procedure setTaille(value:integer);
    function getValue:variant;overload;virtual;
    procedure setValue(value:variant);overload;virtual;
     
    property taille:integer read Ftaille write setTaille;
    property v1:variant read getValue write setValue;
     
    T2_Byte=class(T1)
    protected
    FValue:byte;
     
    function getValue:variant;overload;reintroduce; overload;
    procedure setValue(value:variant);reintroduce; overload;
     
    property value:byte read getValue write setValue;
    Merci bcp d'avance pour votre aide

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 733
    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 733
    Points : 5 402
    Points
    5 402
    Par défaut
    Ce que tu peux faire c'est créer ton T1 avec uniquement la propriété "Taille" et ensuite créer la propriété "Value" dans les objet hérités de T1 et c'est apparemment l'idée que tu as eu.

    Moi je ne déclarerai pas de méthode GetValue dans le T1 car en réalité ce n'est pas cet objet que tu vas utiliser mais ces héritiers

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Tu ne peux pas avoir une propriété d'un certain type et des read/write sur un autre type.

    Ce que tu pourrais envisager est de définir Value comme word dans T1 et de surcharger SetValue dans T2_byte pour tester une limite maxi à 255.

    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
    T1 = class
    protected
      procedure SetValue(aValue :word); virtual;
    public
      property Value:word read FValue write SetValue;
    end;
     
    T2_byte = class(T1)
    protected
      procedure SetValue(aValue :word); override;
    end;
     
    T3_word = class(T1);
     
    ...
     
    procedure T1.SetValue(aValue :word);
    begin
      FValue := aValue;
    end;
     
    procedure T2.SetValue(aValue :word);
    begin
      if aValue <= 255 
      then inherited
      else Exception.Create('Erreur');
    end;

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Merci pour vos réponses

    @popo: oui, j'avais fait comme tu as dit au début. Quand je voulais récupérer la valeur lst[1], il disait que "value" n'existait pas !!
    En fait je voudrais récupérer les valeurs sans utiliser T2_Byte(..) ou T3_Word()
    par exemple : avec b:byte, w:word
    b:=lst[1].value; pas b:= T2_Byte(lst[1].value); ou w:= T3_Word(lst[2].value);
    w:=lst[2].value;
    btw, je ne sais pas si ça marche ou il faut obligatoirement définir le type du paramètre ?!

    @Andnotor: en fait je voudrais que T1 soit généralisé car il aurait T2_Byte, T3_Word ou T5_Carnival ... comme les objets hérités

  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,

    Dans ton cas, l'utilisation d'un propriété Valeur du type variant me paraît le mieux appropriée.

    L'alternative serait un truc un peu plus chiadé avec des interfaces (ou des objets mais je prefère les interfaces):

    Esquisse (donc incomplet) d'un exemple:

    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
     
     TValeurType = (vtEntier, vtMonetaire);
     
     IValeur = interface
      function AsString: string;
      (...)
      property ValeurType: TValeurType read GetValeurType;
     end;
     
     IValeurNumerique = interface(IValeur)
      (...)
      property AsFloat: Double read GetAsFloat write SetAsFloat;
      property AsInteger: Integer read GetAsInteger write SetAsInteger;
     end;
     
     IValeurEntiere = interface(IValeurNumerique)
      (...)
      property Valeur: Integer read GetValeur write SetValeur;
     end;
     
     IValeurMonetaire = interface(IValeurNumerique)
      (...)
      property Valeur: Currency read GetValeur write SetValeur;
     end;
    ainsi qu'une liste de valeurs numeriques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      IValeurNumeriqueListe = interface(IInterfaceList) 
        procedure AddValeur(const Val: IValeurNumerique);
        function GetValeurs(Index: Integer): IValeurNumerique;
        procedure SetValeurs(Index: Integer; const Value: IValeurNumerique);
        function GetAsFloat(Index: Integer): Double;
        procedure SetAsFloat(Index: Integer; const Value: Double);
        property Items[Index: Integer]: IValeurNumerique read GetValeurs write SetValeurs;
        property AsFloat[Index: Integer]: Double read GetAsFloat write SetAsFloat; default;
        function GetEnumerator: TValeurNumeriqueListeEnumerator;
      end;
    dans la pratique ca donnerait:

    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
     
    var
      Liste: IValeurNumeriqueListe;
      ValeurIntf: IValeurNumerique;
      I: Integer;
    begin
      Liste := TValeurNumeriqueListe.Create;
     
      for I := 0 to 9 do
      begin
        if Odd(I) then
          Liste.AddValeur(NewEntier(Random(100)))
        else
          Liste.AddValeur(NewMonetaire(Random * 100));
      end;
     
      for ValeurIntf in Liste do
      begin
        ShowMessage((ValeurIntf as IValeur).AsString);
      end;
     
      for ValeurIntf in Liste do
      begin
        ValeurIntf.AsFloat := 10;
      end;
     
      for ValeurIntf in Liste do
      begin
        ShowMessage((ValeurIntf as IValeur).AsString);
      end;

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 733
    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 733
    Points : 5 402
    Points
    5 402
    Par défaut
    En fait je voudrais récupérer les valeurs sans utiliser T2_Byte(..) ou T3_Word()
    Ca va faire beaucoup de Cast et un code rapidement illisible selon moi.

    par exemple : avec b:byte, w:word
    b:=lst[1].value; pas b:= T2_Byte(lst[1].value); ou w:= T3_Word(lst[2].value);
    Ceci ne peux pas fonctionner puisque "value" n'est pas déclarée dans T1 mais dans ces descendants. Ceci fonctionnera mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b:=T2_Byte(lst[1]).value;
    w:=T3_Word(lst[2]).value;

Discussions similaires

  1. redéfinition de méthode
    Par greg08 dans le forum Langage
    Réponses: 8
    Dernier message: 28/10/2008, 14h59
  2. Réponses: 8
    Dernier message: 01/07/2008, 23h15
  3. héritage et redéfinition de méthodes
    Par Braillane dans le forum Langage
    Réponses: 4
    Dernier message: 07/01/2007, 18h47
  4. redéfinition de méthode et invocation
    Par magedo dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2007, 19h00
  5. [JPanel][LayoutManager] redéfinition de méthodes
    Par _KB_ dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/06/2006, 14h22

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