Naučte se programovat v Delphi (9. díl) - Objekty - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Naučte se programovat v Delphi (9. díl) - Objekty

30. října 2001, 00.00 | V dnešním díle seriálu si probereme Objekty a obecné zásady práce s nimi. Vysvětlíme si pojmy dedičnost,  přístupová práva apod.

Základy OOP

    Object Pascal je objektově orientovaný jazyk, proto budeme hovořit o objektově orientovaném programování (dále jen OOP). OOP je často skloňovaným pojmem v oblasti programování. Dnes se vám pokusím vysvětlit hlavní principy OOP.

    Nejčastěji se objekt srovnává se záznamem (record). Samozřejmě záznam není to samé co objekt a nyní vám popíší rozdíly mezi nimi, protože podle nich velmi dobře (podle mého mínění) pochopíte podstatu objektu.
Nejprve uvedu příklad objektu a pak si probereme jednotlivé řádky kódu.

Type TLetadlo = class  //zde by mohl být uveden předek
  procedure Let(rychlost:Integer);
  palivo:Integer;
  maPasazery:Boolean;
end;

    Objekty se uvozují klíčovým slovem class (u zánamu record). Za class může následovat uvedení předka v závorce protože objekty mohou po předkovi dědit vlastnosti, atributy a metody, ale o tom až později. Na rozdíl od záznamu mohou mít objekty procedury a funkce, kterým souhrnně říkáme metody objektu. Naproti tomu proměnným, které může záznam obsahovat také,  říkáme atributy.

    Metody, které jsou uvedené v deklaraci objektu mají tzv. neúplnou deklaraci, protože deklarace metody se provádí ve dvou krocích. Nejdřív se uvede její identifikátor spolu s proměnnými v těle objektu a její definice se musí uvést zvlášť v sekci implementation.

procedure TLetadlo.Let(rychlost:Integer);
begin
  // implementace dané procedury
end;

    Je tu ještě jeden rozdíl oproti záznamu. Záznamovou proměnnou stačí deklarovat za klíčovým slovem var a už s ní můžete pracovat. Takto to u objektů nefunguje. Instance (objektová proměnná) jen ukazuje na určitou oblast paměti. Vlastní objekt vytvoříme pomocí konstruktoru a pak zrušíme pomocí destruktorů.

Konstruktory a destruktory

    Jak už jsem psal, konstruktorem se objekt vytvoří a destruktorem zruší. Zatímco konstruktor existuje jen jeden, destruktory existují dva.

    Konstruktor je vlastně metoda Create, která se volá až když máme deklarovanou instanci objektu.

var Letadlo:TLetadlo;
begin
  Letadlo:=TLetadlo.Create;
end;

    A teď už můžeme s objektem pracovat. Můžeme přiřazovat proměnným hodnoty, volat metody atd.

...
var
Letadlo:TLetadlo;
begin
  Letadlo:=TLetadlo.Create;
  Letadlo.maPasazery:=true;
  Letadlo.Palivo:=2000;
  Letadlo.Let(20);
end;
...

    V Javě se už dál nemusíte o odstranění objektu starat, protože obsahuje garbage collector, který odstraňuje objekty, na které už není žádný odkaz. Takhle to v Object Pascalu nefunguje. Zde se musíme o zrušení objetku postarat my. K tomu nám Object Pascal nabízí hned dva destruktory, Free a Destroy. Oba slouží k odtranění objektu z paměti, ale přesto jsou rozdílné. Zatímco Free testuje, zda objekt skutečně existuje a pak ho odstraní, Destroy se ho rovnou pokusí odstranit. Proto byste měli dávat přednost destruktoru Free.

Dědičnost

    Každý objekt má svého předka. Pokud neuvedete předka objektu, od kterého má objekt dědit vlastnosti, atributy a metody, přiřadí se objektu předek TObject.

Type TLetadlo = class //zde by mohl být uveden předek
           procedure Let(rychlost:Integer);
           palivo:Integer;
           maPasazery:Boolean;
        end;
       
TBojoveLetadlo = class (TLetadlo)
          maRakety:Boolean;
          pocetRaket:Integer;
      end;

    Mohlo by se zdát, že BojoveLetadlo má jen atributy maRakety a pocetRaket, ale není tomu tak. Jak už jsem psal, tak objekty dědí vlastnosti od svého předka, tím je v tomto případě Letadlo. Takže BojoveLetadlo má vlastnost palivo, maPasazery atd. Chcete důkaz? Zkuste si vytvořit objekt typu TBojoveLetadlo a přiřadit jeho vlastnosti palivo nějakou hodnotu.

...
var BLetadlo:TBojoveLetadlo;
begin
  BLetadlo.Palivo:=200;
  ...
end;
...

Překrývání

    Někdy se může stát, že u potomka uvedete metodu, která má stejný identifikátor, ale třeba rozdílnou implementaci. V tomto případě nová metoda nahradí tu stávající. Těmto metodám říkáme statické.

    V Objekt Pascalu můžeme za neúplnou deklaraci uvést klíčové slovo virtual, kterým kompilátoru říkáme, že metodu nechceme nahradit, ale jen překrýt, což se provádí příkazem override.

Type TLetadlo = class
           procedure Let(rychlost:Integer); virtual;
           palivo:Integer;
           maPasazery:Boolean;
        end;
       
TBojoveLetadlo = class (TLetadlo)
          procedure Let(rychlost:Integer); override;
          maRakety:Boolean;
          pocetRaket:Integer;
      end;

    Mohlo by se vám zdát, že metoda Let() z objektu TBojoveLetadlo překrývá metodu Let() z objektu TLetadlo, ale není tomu tak. Na rozdíl od statické metody, kdy je překrytá metoda ztracena u virtuální metodu můžeme klíčovým slovem inherited zavolat metodu předka.

Vlastnosti

    Vlastnosti už znáte, např. většina komponent má vlastnost enabled typu boolean. Stejně jako všechny objekty, mohou mít i námi definované objekty proměnné. Vlastnost může vypadat jako obyčejná objektová proměnná (může to být i funkce nebo procedura), ale není to obyčejný atribut. Na rozdíl od  atributu je vlastnost deklarována klíčovým slovem property, potom následuje typ vlastnosti a tzv. čtecí a zapisovací část.

property Enabled:Boolean read FEnabled write FEnabled;

    Čtecí a zapisovací část musejí být deklarovány jako objektové metody. Demonstraci použití čtecí a zapisovací procedury předvedu na vlastnosti left objektu TObject;

type TObject = class
          fLeft:Integer:
          function
ReadLeft:Integer;
          procedure WriteLeft(i:integer);
          property Left:Integer read ReadLeft write WriteLeft;
        end;

TObject.ReadLeft:Integer;
begin
   ReadLeft:=FLeft;
end;

TObject.WriteLeft(i:Integer);
begin
  FLeft:=i;
end;

   Jak už jsem výše uvedl, vlastnosti se dědí s každým novým objektem.

Přístupová práva

    Snad v každém objektově orientovaném jazyku můžete nastavit přístupová práva. V Object Pascalu se o dělá pomocí klíčových slov private, public, protected a published. První dva určují zda budou atributy nebo metody viditelné z vnější jednotky. Klíčové slovo public to dovoluje, ale private ne. Pomocí published se také zveřejňují metody a atributy stejně jako u public, ale u published obsahují metody a vlastnosti informace pro běh programu, díky kterým vidíme dané vlastnosti v Object Inspectoru. Aby toto bylo možné je nutné kompilovat předka nebo rovnou daný objekt s příkazem kompilátoru $M, o tom až v některé z dalších kapitol. Abyste si otestovali omezení přístupu nemusíte chodit daleko, předem předdefinovaná aplikace s formulářem obsahuje tento kód.

TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;


    Příkaz protected funguje dobně jako private, ale přístup nemusí být ze stejné jednotky. Všechny tyto příkazy lze použít na atributy, metody a vlasnosti objektu.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: