430 likes | 573 Views
Informatika I 10 . přednáška. RNDr. Jiří Dvořák, CSc. dvorak @uai.fme.vutbr.cz. Obsah přednášky. Objekty v Turbo a Borland Pascalu Objekty v Object Pascalu Prostředí Delphi. Objektový typ v Turbo Pascalu. ident_typu = object ( ident_typu_předka ) { předek nemusí být uveden }
E N D
Informatika I10. přednáška RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
Obsah přednášky • Objekty v Turbo a Borland Pascalu • Objekty v Object Pascalu • Prostředí Delphi Informatika I: přednáška 10
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 10
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ýchslož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 10
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 10
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 10
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 10
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 10
Příklady implementace metod constructor TObrazec.Inic(InicX,InicY:integer); begin X:=InicX; Y:=InicY; Viditelny:=false; end; function TObrazec.DejX:integer; begin DejX:=X; end; function TObrazec.DejY:integer; begin DejY:=Y; end; function TObrazec.JeVidet:boolean; begin JeVidet:=Viditelny; end; procedure TObrazec.Kresli; begin {Obrazec je abstraktni pojem, takze tato metoda je prazdna} end; Informatika I: přednáška 10
procedure TObrazec.Ukaz; begin Viditelny:=true; SetColor(Barva); {nastaveni na barvu pro kresleni obrazcu} Kresli; end; procedure TObrazec.Smaz; begin Viditelny:=false; SetColor(GetBkColor); {nastaveni na barvu pozadi} Kresli; end; procedure TObrazec.PresunDo(NoveX,NoveY:integer); begin Smaz; X:=NoveX; Y:=NoveY; Ukaz; end; destructor TObrazec.Odstran; begin Smaz; end; Informatika I: přednáška 10
procedure TBod.Kresli; begin PutPixel(X,Y,GetColor); end; constructorTKruznice.Inic(InicX,InicY,InicR:integer); begin TObrazec.Inic(InicX,InicY); R:=InicR; end; procedureTKruznice.Kresli; begin Graph.Circle(X,Y,R);{Circle je procedura jednotky Graph} end; constructorTElipsa.Inic(InicX,InicY,InicR,InicR2:integer); begin TKruznice.Inic(InicX,InicY,InicR); R2:=InicR2; end; procedureTElipsa.Kresli; begin Graph.Ellipse(X,Y,0,360,R,R2); end; Informatika I: přednáška 10
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 atabulkou virtuálních metod příslušného objektového typu. Informatika I: přednáška 10
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 10
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 10
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 10
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 10
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 10
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 10
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 10
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; 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 10
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 10
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 10
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 10
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 10
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 10
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 10
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 10
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 10
. . . var A:Tpole; begin A:=Tpole.Init; A.Cti; A.Serad; A.Pis_poradi; writeln('Stiskni Enter'); readln; end. Informatika I: přednáška 10
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 10
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 10
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 10
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 10
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 10
Struktura programu v Delphi program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Informatika I: přednáška 10
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 10
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 10
var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin end; end. Informatika I: přednáška 10
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 10
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 10
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 10
whilenot 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; 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 10
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 ObjectInspectorem. 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. Informatika I: přednáška 10