Properties a Index

vložil Radek Červinka 10. srpna 2013 09:37

Přiznám se, že následující část možnosti property mi nebyla známou a nejsem si jist zda to není nějaká novinka. Jde o to, že kromě property typu pole, což je snad všeobecně známo a používáno, lze dodefinovat další property, které index do pole mají jako konstantu a jsou tak něco jako zkratka pro určité prvky pole. Z příkladu to bude jasnější:

    1type
    2    TRectangle = class
    3      private
    4        FCoordinates: array[0..3] of Longint;
    5        function GetCoordinate(Index: Integer): Longint;
    6        procedure SetCoordinate(Index: Integer; Value: Longint);
    7      public
    8        property Left: Longint index 0  read GetCoordinate 
    9                                        write SetCoordinate;
   10        property Top: Longint index 1   read GetCoordinate 
   11                                        write SetCoordinate;
   12        property Right: Longint index 2 read GetCoordinate
   13                                        write SetCoordinate;
   14        property Bottom: Longint index 3 read GetCoordinate
   15                                         write SetCoordinate;
   16        property Coordinates[Index: Integer]: Longint 
   17                                        read GetCoordinate
   18                                        write SetCoordinate;
   19   20    end;

Property Coordinates je klasická old-school property pole, která používá GetCoordinate a SetCoordinate pro vrácení prvku pole, ale všimněte si Left, Top, Right a Bottom. Tyto ukazují který index z pole představuje položku. Nevím, odkdy toto Delphi podporuje, ale je to podle mne šikovné.


Nabízíme Delphi školení a konzultace na různá témata, primárně ve Vaší firmě.

Tagy: ,

Jazyk | Začátečníci

Komentáře

10.8.2013 11:45:41 #

pepak

Tohle je v Delphi už dávno, funguje to i v Delphi 5. Například Delphi 2009 to intenzivně využívají v SOAPu.

pepak

10.8.2013 19:47:10 #

daks

Index se dá použít už v D2. Já jsem to hlavně chápal jako mechanismus pro zjednodušení kódu, možnost použít společnou Get a Set metodu pro víc vlastností stejnýho typu.

daks

1.9.2013 22:28:31 #

Igor Gottwald

K tomuto tématu bych snad jen doplnil, že to lze použít i s jinýmy ordinálními typy než je Integer, především ale s vlastními výčtovými typy.
Lze např. zapsat:

type
  TCoord = (coLeft, coTop, coRight, coBottom);
  TGenCoord<T> = class
  protected
    function GetCoord(Index: TCoord): T; virtual; abstract;
    procedure SetCoord(Index: TCoord; Value: T); virtual; abstract;
  public
    property Left: T index coLeft read GetCoord write SetCoord;
    property Right: T index coRight read GetCoord write SetCoord;
    property Top: T index coTop read GetCoord write SetCoord;
    property Bottom: T index coBottom read GetCoord write SetCoord;
  end;

Výhody takto definované třídy při pozdější implementaci jsou patrné.
Pokud budu chtít třídu nadefinovat pro uložení koordinátů s plovoucí čárkou, stačí zapsat:

type
  TFloatCoord = class(TGenCoord<Integer>)
  protected
    function GetCoord(Index: TCoord): Integer; override;
    procedure SetCoord(Index: TCoord; Value: Integer); override;
  end;

Pak už záleží jen na použití, kde budou hodnoty uchovány, zda v paměti, v databázi apod.
Každopádně namísto implementace dvou procedur pro každou property nám stačí dvě, kde bude jedna podmínka CASE:

function TFloatCoord.GetCoord(Index: TCoord): Integer;
begin
  case (Index) of
    coLeft: Result := ...;
    coTop: Result := ...;
    coRight: Result := ...;
    coBottom: Result := ...;
    else raise Exception.Create('Undefined enumeration #' + IntToStr(Ord(Index)));
  end;
end;

Igor Gottwald

1.9.2013 22:30:47 #

Igor Gottwald

Pardon, koukám, že jsem nevysvětlil tu výhodu výčtového typu: když těch vlastností bude větší množství, snadno při pozdější implementaci zaměníte dvě hodnoty, ale výčtový typ vám bude neustále 'napovídat', se kterou hodnotu vlastně pracujete.

Igor Gottwald

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS