Informatika I 12. přednáška RNDr. Jiří Dvořák, CSc.
Informatika I: přednáška 122 Obsah přednášky Jazyky pro OOP Objekty v Turbo a Borland Pascalu Objekty v Object Pascalu Prostředí Delphi
Informatika I: přednáška 123 Jazyky pro OOP Jazyky čistě objektové (Smalltalk, Actor, CLOS, … ) Jazyky podporující OOP, ale umožňující programovat i neobjektově (Borland Pascal, Object Pascal, C++, … )
Informatika I: přednáška 124 Objektový typ v Turbo Pascalu ident_typu = object(ident_typu_předka) {předek nemusí být uveden} ident_položky: typ1; seznam identifikátorů položek: typ2;. hlavička metody 1; {statická metoda} hlavička metody 2; virtual;. end; Pozn.: Objektový typ musí být definován na nejvyšší úrovni programu nebo programové jednotky.
Informatika I: přednáška 125 Objektový typ v Borland Pascalu ident_typu = object(ident_typu_předka) {předek nemusí být uveden} seznam veřejných složek {lze vynechat} private seznam soukromých složek public seznam veřejných složek. end; Pozn.: Sekce private a public mohou být vynechány nebo se mohou opakovat v libovolném pořadí.
Informatika I: přednáška 126 Příklad definice objektových typů type TObrazec = object X,Y:integer; {souradnice polohy} Viditelny:boolean; constructor Inic(InicX,InicY:integer); function DejX:integer; function DejY:integer; function JeVidet:boolean; procedure Kresli; virtual; procedure Ukaz; {pouziva metodu Kresli} procedure Smaz; {pouziva metodu Kresli pri pouziti stejne barvy jako je barva pozadi} procedure PresunDo(NoveX,NoveY:integer); {pouziva metody Smaz (na puvodni pozici) a Ukaz (na nove pozici)} destructor Odstran; virtual; end;
Informatika I: přednáška 127 TBod = object(TObrazec) procedure Kresli; virtual; end; TKruznice = object(TObrazec) R:integer; {polomer} constructor Inic(InicX,InicY,InicR:integer); procedure Kresli; virtual; end; TElipsa = object(TKruznice) R2:integer; {delka 2. poloosy} constructor Inic(InicX,InicY,InicR,InicR2:integer); procedure Kresli; virtual; end;
Informatika I: přednáška 128 Oblast platnosti identifikátorů a přístupnost složek Oblastí platnosti identifikátoru složky objektového typu (položky nebo metody) je příslušný objektový typ a všichni jeho potomci včetně bloků implementace metod. Identifikátor složky tedy musí být jedinečný v rámci příslušného objektového typu a jeho metod a všech jeho potomků a jejich metod. Složky definované v neoznačené sekci hned za hlavičkou objektového typu nebo v sekci public jsou přístupné bez omezení. Složky definované v sekci private jsou přístupné pouze v rámci modulu (programu nebo programové jednotky), který obsahuje definici tohoto objektového typu.
Informatika I: přednáška 129 Metody Typy metod: procedure, function, constructor, destructor. Metody a typ vazby: statické (časná vazba) virtuální (pozdní vazba) Pozn.: Konstruktor nemůže být virtuální metodou. Implementace metod: Musí být provedena na stejné úrovni jako definice příslušného objektového typu. Označení metody při implementaci: ident_objektového_typu.ident_metody Volání metod: ident_objektu.ident_metody(seznam parametrů)
Informatika I: přednáška 1210 Příklady implementace metod constructor TObrazec.Inic(InicX,InicY:integer); begin X:=InicX; Y:=InicY; end; function TObrazec.DejX:integer; begin DejX:=X; end;... procedure TObrazec.Kresli; begin {Obrazec je abstraktni pojem, takze tato metoda je prazdna} end;... destructor TObrazec.Odstran; begin Smaz; end;
Informatika I: přednáška 1211 Virtuální metody a konstruktor Virtuální metoda může být předefinována pouze virtuální metodou, jejíž hlavička navíc musí být identická s metodou původní. Jestliže objektový typ dědí nebo definuje virtuální metody, pak každá jeho instance musí být inicializována voláním konstruktoru před prvým použitím virtuálních metod. To znamená, že každý objektový typ, který obsahuje virtuální metody, musí mít alespoň jeden konstruktor (vlastní nebo zděděný). Konstruktor kromě provedení příkazů uvedených v jeho příkazové části ustavuje spojení mezi objektem a tabulkou virtuálních metod příslušného objektového typu.
Informatika I: přednáška 1212 Objekty Objekt = instance objektového typu Statické objekty: Jejich vytvoření se zajistí deklarací příslušných proměnných v úseku var. Dynamické objekty: Pro práci s nimi je třeba definovat proměnné typu ukazatel na příslušný objektový typ. Dynamické objekty se vytvářejí pomocí procedury new ve spolupráci s konstruktorem a ruší se pomocí procedury dispose ve spolupráci s destruktorem.
Informatika I: přednáška 1213 Příklady se statickými objekty var A,B:TBod; Kr:TKruznice; El:TElipsa;... A.Inic(50,50); A.Ukaz; B.Inic(150,150); B.Ukaz; Kr.Inic(100,100,30); Kr.Ukaz; El.Inic(180,100,40,20); El.Ukaz; Kr.PresunDo(100,150).
Informatika I: přednáška 1214 Dynamické objekty Vytvoření dynamického objektu: new(proměnná typu ukazatel na objektový typ, ident_konstruktoru(seznam parametrů)) Zrušení dynamického objektu: dispose(proměnná typu ukazatel na objektový typ, ident_destruktoru)
Informatika I: přednáška 1215 Příklady s dynamickými objekty type TUkBod = ^TBod; TUkKruznice = ^TKruznice; TUkElipsa = ^TElipsa;... var UA,UB:TUkBod; UKr:TUkKruznice; UEl:TUkElipsa;... new(UEl,Inic(100,100,50,30)); UEl^.Ukaz; dispose(UEl,Odstran);
Informatika I: přednáška 1216 Příklad použití objektů unit Trideni; {Jednotka vyvazi abstraktni objektovy typ s vestavenou metodou bublinoveho trideni} interface const Nmax=100; type Trozsah=1..Nmax; TPoradi=object N:Trozsah; Poradi:array[Trozsah] of Trozsah; constructor Init; procedure Inicializuj; function Nema_predchazet(i,j:Trozsah):boolean; virtual; procedure Vymen(i,j:Trozsah); procedure Serad; end; implementation constructor TPoradi.Init; begin end;
Informatika I: přednáška 1217 procedure TPoradi.Inicializuj; var i:Trozsah; begin for i:=1 to Nmax do Poradi[i]:=i; end; function TPoradi.Nema_predchazet(i,j:Trozsah):boolean; begin Nema_predchazet:=false; end; procedure TPoradi.Vymen(i,j:Trozsah); var p:Trozsah; begin p:=Poradi[i]; Poradi[i]:=Poradi[j]; Poradi[j]:=p; end; procedure TPoradi.Serad; var i,j:Trozsah; begin for i:=1 to N-1 do for j:=1 to N-i do if Nema_predchazet(j,j+1) then Vymen(j,j+1); end; end.
Informatika I: přednáška 1218 program AplikaceTrideni; {Provadi vzestupne trideni pole zaznamu podle daneho klice} uses Trideni; type Tprvek=record klic:integer; hodn:string; end; Tpole=object(Tporadi) Pole:array[Trozsah] of Tprvek; function Nema_predchazet(i,j:Trozsah):boolean; virtual; procedure Cti; procedure Pis_poradi; function Dej_N:Trozsah; procedure Dej_prvek_pole(i:Trozsah; var Prvek:Tprvek); end; function Tpole.Nema_predchazet(i,j:Trozsah):boolean; var pi,pj:Trozsah; begin pi:=Poradi[i]; pj:=Poradi[j]; Nema_predchazet:=Pole[pi].klic>Pole[pj].klic; end;
Informatika I: přednáška 1219 procedure Tpole.Cti; var i:Trozsah; begin Inicializuj; writeln('Zadej pocet prvku'); readln(N); for i:=1 to N do begin write(i,': '); with Pole[i] do readln(klic,hodn); end; procedure Tpole.Pis_poradi; var i:Trozsah; begin writeln; for i:=1 to N do with Pole[Poradi[i]] do writeln(klic:5,hodn); end;
Informatika I: přednáška 1220 function Tpole.Dej_N:Trozsah; begin Dej_N:=N; end; procedure Tpole.Dej_prvek_pole(i:Trozsah; var Prvek:Tprvek); begin Prvek:=Pole[Poradi[i]]; end; var A:Tpole; begin A.Init; A.Cti; A.Serad; A.Pis_poradi; writeln('Stiskni Enter'); readln; end. Pozn: Uvedený program by po doplnění direktivy {$APPTYPE CONSOLE} za hlavičku programu fungoval i v Delphi.
Informatika I: přednáška 1221 Struktura jednotky v Object Pascalu unit jméno_jednotky; interface... implementation... initialization {volitelná inicializační část}... finalization {volitelná úklidová část}... end.
Informatika I: přednáška 1222 Třída v Object Pascalu ident_typu = class(ident_typu_předka) {Předek nemusí být uveden} seznam veřejných složek private seznam soukromých složek public seznam veřejných složek protected seznam chráněných složek {Složky zde uvedené jsou přístupné této třídě a všem jejím potomkům} end;
Informatika I: přednáška 1223 Metody v Object Pascalu Statické hlavička metody; Virtuální hlavička metody; virtual; Dynamické hlavička metody; dynamic; Předefinované dynamické nebo virtuální hlavička metody; override;
Informatika I: přednáška 1224 Virtuální a dynamické metody Virtuální i dynamické metody jsou volány pomocí pozdní vazby, ale liší se mechanismem jejího zabezpečení. Virtuální metody: Zajištění pozdní vazby je rychlejší, ale má větší nároky na paměť. Dynamické metody: Zajištění pozdní vazby je pomalejší, ale má menší nároky na paměť. Předefinování virtuální nebo dynamické metody: Místo direktivy virtual nebo dynamic je nutno použít direktivu override.
Informatika I: přednáška 1225 Objekty v Object Pascalu Objekty (instance tříd) jsou implicitně dynamické, ovšem v textu programu se s nimi zachází tak, jako by byly statické. var ident_objektu: ident_třídy; {Tato proměnná je fyzicky reprezentována jako ukazatel} Vytvoření objektu: ident_objektu:= ident_třídy.ident_konstruktoru(...); Volání metod objektu: ident_objektu.ident_metody(...)
Informatika I: přednáška 1226 Náhrada objektového typu třídou class v jednotce a programu pro třídění unit Trideni; interface const Nmax=100; type Trozsah=1..Nmax; TPoradi=class N:Trozsah; Poradi:array[Trozsah] of Trozsah; constructor Init; procedure Inicializuj; function Nema_predchazet(i,j:Trozsah):boolean; virtual; procedure Vymen(i,j:Trozsah); procedure Serad; end; implementation. end.
Informatika I: přednáška 1227 program AplikaceTrideni; {$APPTYPE CONSOLE} {Provadi vzestupne trideni pole zaznamu podle daneho klice} uses Trideni; type Tprvek=record klic:integer; hodn:string; end; Tpole=class(Tporadi) Pole:array[Trozsah] of Tprvek; function Nema_predchazet(i,j:Trozsah):boolean; override; procedure Cti; procedure Pis_poradi; function Dej_N:Trozsah; procedure Dej_prvek_pole(i:Trozsah; var Prvek:Tprvek); end;.
Informatika I: přednáška var A:Tpole; begin A:=Tpole.Init; A.Cti; A.Serad; A.Pis_poradi; writeln('Stiskni Enter'); readln; end.
Informatika I: přednáška 1229 Některé další rysy Object Pascalu Třída může obsahovat také sekci published (pro její složky je možno zjistit informace o typu za běhu programu). Třída vedle metod instancí může obsahovat také metody třídy (class methods). Složkami třídy mohou být také vlastnosti. Vlastnost (property) je definována svým jménem a mechanismem získání nebo změny hodnoty vlastnosti. Významným rysem Object Pascalu je mechanismus zpracování výjimek, který usnadňuje zajištění robustnosti programu (tj. jeho schopnosti zotavit se z chybových situací).
Informatika I: přednáška 1230 Programovací prostředí Delphi Objektově orientované programování v jazyku Object Pascal Rychlý vývoj aplikací a prototypů Událostmi řízené programování Vizuální programování Automatické generování části kódu Vytváření databázových aplikací Vytváření aplikací s více vlákny provádění
Informatika I: přednáška 1231 Třídy a objekty v Delphi Předkem všech tříd v Delphi je třída TObject. Není-li tedy v definici třídy uveden předek, je třída přímým potomkem třídy TObject. Každá třída dědí od třídy TObject konstruktor Create a destruktory Destroy a Free. Přednostně by se měl používat destruktor Free, neboť nejprve testuje, zda objekt skutečně existuje a teprve potom provede jeho zrušení pomocí Destroy.
Informatika I: přednáška 1232 Komponenty Delphi Komponenty Delphi zajišťují uživatelské rozhraní. Základními komponentami jsou formuláře, do kterých se vkládají další komponenty (tlačítka, přepínače, titulky, editační okna, dialogová okna, … ). Pro každý formulář vytvoří Delphi zvláštní jednotku. Všechny komponenty jsou implementovány jako objekty Object Pascalu. Třídy komponent jsou součástí knihovny vizuálních komponent (VCL - Visual Component Library).
Informatika I: přednáška 1233 Vlastnosti a události Každá komponenta nabízí řadu vlastností, které určují vzhled či chování komponenty, a událostí, které se mohou vyskytnout v souvislosti s komponentou. Vlastnosti mohou být měněny v Object Inspectoru nebo za běhu programu. Pro každou událost je možno nastavit v Object Inspectoru obslužnou rutinu události, která je volána při vzniku dané události. Rutiny obsluhy událostí jsou jedním z klíčových prvků programování v Delphi.
Informatika I: přednáška 1234 program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Struktura programu v Delphi
Informatika I: přednáška 1235 Objekt Application Application je objekt třídy TApplication a je definován v jednotce Forms. Tento objekt zapouzdřuje většinu práce, která je nutná k rozběhnutí programu ve Windows. Metoda Initialize zařizuje vše, co je nutné provést před vlastním spuštěním programu. Metoda CreateForm inicializuje formulář. Metoda Run přebírá události a rozděluje je do formulářů aplikace do té doby, než přijde příkaz k ukončení programu.
Informatika I: přednáška 1236 Předdefinovaná struktura jednotky Jednotka přísluší k formuláři Form1, jehož součástí je tlačítko Button1. Objekt Form1 obsahuje metodu Button1Click pro ošetření události spočívající v kliknutí na tlačítko Button1. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
Informatika I: přednáška 1237 var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin end; end.
Informatika I: přednáška 1238 Program pro určení četností program Cetnosti; uses Forms, UCetnosti in 'UCetnosti.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Pozn.: Tento program je automaticky vygenerován systémem a uložen v souboru Cetnosti.dpr. Dále jsou automaticky vytvořeny soubory Cetnosti.cfg, Cetnosti.dof a Cetnosti.res.
Informatika I: přednáška 1239 unit UCetnosti; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) LNadpis: TLabel; EVstup: TEdit; EVystup: TEdit; LVstup: TLabel; LVystup: TLabel; BStart: TButton; procedure BStartClick(Sender: TObject); end; var Form1: TForm1;
Informatika I: přednáška 1240 implementation {$R *.dfm} procedure UrciCetnosti(S1,S2:string); {Parametry teto procedury jsou jmena fyzickych souboru - vstupniho a vystupniho} var Zn:char; Cetnost:array['a'..'z'] of integer; Vstup,Vystup:TextFile; begin for Zn:='a' to 'z' do Cetnost[Zn]:=0; assignfile(Vstup,S1); assignfile(Vystup,S2); reset(Vstup); rewrite(Vystup);
Informatika I: přednáška 1241 while not eof(Vstup) do begin read(Vstup,Zn); if Zn in ['a'..'z'] then Cetnost[Zn]:=Cetnost[Zn]+1 else if Zn in ['A'..'Z'] then begin Zn:=chr(ord(Zn)+ord('a')-ord('A')); Cetnost[Zn]:=Cetnost[Zn]+1; end; writeln(Vystup, 'Cetnosti pismen v souboru ',S1); writeln(Vystup); writeln(Vystup,'pismeno cetnost'); writeln(Vystup,' '); for Zn:='a' to 'z' do writeln(Vystup,Zn:4,Cetnost[Zn]:9); closefile(Vstup); closefile(Vystup); end;
Informatika I: přednáška 1242 procedure TForm1.BStartClick(Sender: TObject); {Procedura se spusti po kliknuti na tlacitko BStart na formulari. Predtim je ale třeba zadat jmena fyzickych souboru do editacnich poli EVstup a EVystup, cimz se nastavi hodnoty vlastnosti Text techto komponent.} var S1,S2:string; begin S1:=EVstup.Text; S2:=EVystup.Text; UrciCetnosti(S1,S2); Application.Terminate; end; end. Pozn.: Z textu této jednotky programátor vytváří pouze proceduru UrciCetnosti a tělo procedury TForm1.BStartClick. Vše ostatní se generuje automaticky na základě umisťování komponent na formulář a práce s Object Inspectorem. Vytvořený zdrojový text jednotky je uložen v souboru UCetnosti.pas. Kromě toho je vygenerován soubor UCetnosti.dfm, který obsahuje použité komponenty a jejich vlastnosti.