Denumirea lucrării: Clase și obiecte din Object Pascal
Domeniu: Informatică, Cibernetică și Programare
Descriere: Clase și obiecte Clasele din Object Pascal sunt tipuri speciale care conțin câmpuri, metode și proprietăți. Ca orice alt tip, clasa servește ca model numai pentru crearea de instanțe specifice de implementare, care sunt numite obiecte. Chiar atunci.
Mărime fișier: 82,5 KB
Lucrarea a fost descărcată: 50 de persoane.
Clasele din Object Pascal sunt tipuri speciale care conțin câmpuri, metode și proprietăți. Ca orice alt tip, clasa servește ca model numai pentru crearea de instanțe specifice de implementare, care sunt numite obiecte. Imediat voi clarifica că în obiectul predecesor Object Pascal - obiectele Turbo Pascal sunt numite tipuri care au multe în comun cu clasele Object Pascal. Totuși, îmbunătățiri semnificative aduse modelului obiect Object Pascal au obligat dezvoltatorii limbii să introducă un termen special pentru desemnarea obiectelor - o clasă împrumutate, întâmplător, din C ++. Pentru compatibilitatea cu programele dezvoltate anterior cu programul Obiecte Pascal Turbo Pascal, Object Pascal, se stochează un tip de obiect care acceptă modelul obiect "vechi". Deoarece toate posibilitățile acestui model sunt accesibile clasei, nu o vom lua în considerare, iar obiectul termen "eliberat" va fi folosit exclusiv pentru a desemna o instanță specifică de implementare a clasei.
O diferență importantă între clase de alte tipuri este aceea că obiectele de clasă sunt întotdeauna alocate pe heap, astfel încât obiectul variabil reprezintă de fapt doar un indicator pentru zona de memorie dinamică. Cu toate acestea, spre deosebire de alți indicatori, atunci când se face trimitere la conținutul unui obiect, nu puteți folosi caracterul "^" după numele obiectului:
MyClass ^ .Field: = 0; // Eroare. Ar trebui să fie scris astfel:
CONCEPTE DE BAZĂ
Clasele reprezintă o "invenție" specială a programatorilor pentru simplificarea dezvoltării programelor complexe și îmbunătățirea calității acestora. În cadrul claselor există trei principii fundamentale, care se numesc încapsulare, moștenire și polimorfism.
încapsulare
Encapsularea este un mijloc puternic de schimb de software gata de lucru. Biblioteca de clase Delphi este, de fapt, un set de "cărămizi" create de programatorii Borland pentru a vă construi programele.
moștenire
O clasă derivată moștenește automat câmpurile, metodele și proprietățile părintelui său și poate adăuga altele noi. Astfel, principiul moștenirii asigură crearea pe etape a claselor complexe și dezvoltarea propriilor biblioteci de clase.
Principiul de moștenire conduce la crearea unui arbore de clasă ramificată, care crește treptat atunci când vă mutați de la TObject la descendenții săi. Fiecare descendent completează posibilitățile părintelui său cu cele noi și le transmite descendenților lor.
De exemplu, în Fig. 1 arată un mic fragment din arborele clasei Delphi. Clasa TPersistent îmbogățește capabilitățile TObject-ului său: poate "stoca" datele într-un fișier și le poate primi de la acesta, astfel încât toți descendenții săi pot face acest lucru. Clasa TComponent, la rândul său, poate interacționa cu mediul dezvoltatorului și poate transfera această abilitate descendenților săi. TControl nu numai că poate lucra cu fișierele și mediul de dezvoltare, dar poate crea și menține imagini vizibile pe ecran, iar descendentul său TWinControl poate crea ferestre Windows etc.
Fig. 1. Fragmentul arborelui de clasă Object Pascal
polimorfism
Polimorfismul este proprietatea clasei de a rezolva probleme similare în diferite moduri. În Object Pascal, proprietățile comportamentale ale unei clase sunt determinate de setul de metode incluse în ea. Prin schimbarea algoritmului uneia sau a altei metode în descendenții clasei, programatorul poate da acestor descendenți proprietățile specifice lipsă ale copilului. Pentru a schimba metoda, este necesar să o ignorăm în descendent, adică să declare în descendență metoda cu același nume și să pună în aplicare acțiunile necesare în el. Ca rezultat, două metode similare vor funcționa în obiectul parental și în obiectul descendent, având o bază algoritmică diferită și, prin urmare, conferă obiectelor proprietăți diferite. Aceasta se numește polimorfismul obiectelor.
În Object Pascal, polimorfismul este realizat nu numai prin moștenirea și suprapunerea metodelor părinte descrise mai sus, ci și prin virtualizarea acestora (vezi mai jos), care permite metodelor părinților să acceseze metodele descendenților lor.
Câmpurile sunt încapsulate în datele de clasă. Câmpurile pot fi de orice tip, inclusiv clase, de exemplu:
Fiecare obiect primește un set unic de câmpuri, dar un set de metode și proprietăți comune tuturor obiectelor din această clasă. Principiul fundamental al încapsulării necesită accesul câmpurilor numai utilizând metode și proprietăți de clasă. Cu toate acestea, în Object Pascal, puteți accesa direct câmpurile. Pentru a face acest lucru, folosiți nume de câmp compuse care conțin numele obiectului ca prefix:
aObject.aStrField: = 'Șir de caractere';
Clasa de copii primește toate câmpurile tuturor strămoșilor săi și le poate completa cu propriile lor, dar nu le poate ignora sau le poate șterge. Astfel, cu cât clasa este mai mică în arborele ierarhic, cu atât mai multe date sunt disponibile obiectelor sale.
Incapsulate în procedurile de clasă și funcțiile sunt numite metode. Ele sunt declarate în același mod ca și subrutinele obișnuite:
funcția MyFunc (aPar: Integer): Integer;
Accesul la metodele unei clase, precum și la câmpurile sale, este posibil cu ajutorul denumirilor compuse:
După cum am menționat deja, metodele de clasă se pot suprapune în mai multe moduri. De exemplu:
Descendenții ambelor clase pot efectua o procedură similară numită DoWork. dar, în general, o vor face diferit. O astfel de înlocuire a metodelor se numește statică, deoarece implementat de compilator.
Să presupunem, de exemplu, că clasa parentală, utilizând metodele Show and Hide, respectiv arată ceva pe ecran sau ascunde imaginea. Pentru a crea o imagine, utilizează metoda Draw cu un parametru logic:
Egalarea procedurilor (IsShow: Boolean); virtuale;
Egalarea procedurilor (IsShow: Boolean); suprascrie;
Implementarea metodelor Show and Hide este foarte simplă:
Metodele Draw ale părintelui și ale copilului au implementări diferite și creează imagini diferite. Ca rezultat, metodele părinte Show and Hide vor ascunde sau afișa aceste sau alte imagini în funcție de implementarea particulară a metodei Draw a oricărui descendent. Legarea dinamică implementează polimorfismul de clasă.
Metodele suprapuse dinamic pot face adesea deloc nimic. Astfel de metode sunt numite abstract, ele trebuie să se suprapună în descendenți. Un programator poate dezactiva o metodă abstractizată, declarând-o cu o directivă abstractă. De exemplu:
Egalarea procedurilor (IsShow: Boolean); virtuale; abstract;
Egalarea procedurilor (IsShow: Boolean); suprascrie;
aVisualObject.Show; // Eroare! Apel la metoda abstractă
aVisualChild.Show; // Acces normal. Metoda Draw a clasei
Apelarea unei metode abstracte care nu este înlocuită provoacă o eroare de rulare. Desigur, într-un program bine conceput, metodele abstracte nu sunt niciodată chemate. Clasele care conțin metode abstracte sunt numite clase abstracte. Astfel de clase încapsulează proprietățile generale ale descendenților lor ne-abstracți, dar obiectele clasei abstracte nu sunt niciodată create sau utilizate. Pentru a folosi clasele abstracte în biblioteca de clase Delphi, sunt incluse clasele copil în care se suprapun metodele abstracte ale părintelui.
Constructor Creare (valoare: Integer);
Toate câmpurile de obiecte, precum și metodele de clasă care operează pe câmpurile sale, pot fi apelate numai după ce obiectul este creat utilizând apelul constructor, deoarece constructorii distribuie obiectul în memoria dinamică și fac validă indicatorul conținut în obiect.
MyObject.IntField: = 0; // Eroare! Obiectul nu a fost creat de constructor!
MyObject: = TMyClass.Create; // Este necesar astfel: vom crea obiect
MyObject.IntField: = 0; // și se referă la domeniul său.
MyObect.Free; // Distruge obiectul inutil
Majoritatea designerilor implementează unele acțiuni care nu sunt necesare pentru funcționarea corectă a obiectului. Prin urmare, în constructorul clasei descendente, trebuie mai întâi să apelați la constructorul părintelui dvs. și apoi să efectuați acțiuni suplimentare. Apelarea oricărei metode de clasă parentală suprapusă este realizată utilizând cuvântul rezervat Mostenit (moștenit).
Constructorul TMyClass.Create (Valoare: Integer);
// Posibilă implementare a constructorului
Moștenit crea; / / Apelați constructorul mostenit
IntField: = Valoare; // Implementăm acțiuni suplimentare
Unele metode pot fi chemați fără crearea sau inițierea unui obiect. Astfel de metode se numesc metode de clasă, sunt declarate folosind clasa de cuvinte rezervate:
funcție de clasă GetClassName: String;
funcția GetField: Integer;
procedura SetField (Valoare: Integer);
Proprietate IntegerValue: Integer citire GetField write SetField;
În contextul programului, proprietatea se comportă ca un câmp obișnuit. De exemplu, am putea scrie astfel de operatori:
aClass: = TaClass.Create;
înainte de a accesa un câmp sau o proprietate!
aClass.Destroy; // Ștergeți un obiect inutil
În plus, este posibilă următorul operator de atribuire:
Diferența dintre operatorul respectiv și operator
este că atunci când accesați o proprietate, metoda SetField este conectată automat, în care pot fi implementate anumite acțiuni.
Exemplu: luați în considerare următoarea declarație
Proprietatea Caption a componentei Label apelează metoda SetText, care nu numai că memorează șirul de caractere din variabila internă, dar desenează și eticheta cu text nou.
Dacă nu aveți nevoie de acțiuni speciale la citirea sau scrierea unei proprietăți, puteți specifica numele câmpului în locul denumirii metodei corespunzătoare:
procedura SetField (Valoare: Integer);
Proprietate IntegerValue: Integer citit IntFiled write SetField;
Dacă doriți ca câmpul să fie doar pentru citire sau numai pentru scriere, trebuie să omiteți partea de scriere sau citire. În general, o proprietate nu poate fi asociată unui câmp. De fapt, descrie una sau două metode care efectuează anumite acțiuni pe date de același tip ca și proprietatea.
Orice clasă nou creată conține patru secțiuni definite de cuvintele rezervate publicate, private, protejate și publice. În fiecare secțiune sunt definite mai întâi câmpurile, urmate de metode și proprietăți.
Următorul fragment de cod explică domeniul de aplicare.
Folosește Controale, Formulare;
Buttonl: TButton; // Această secțiune este difuzată de Delphi
Elementele ei sunt disponibile tuturor
private // Această secțiune este disponibilă în Unitatea1
procedura SetValue (valoare: Integer);
funcția GetValue: Integer;
publicat // Această secțiune este disponibilă în orice modul
Proprietatea IntField: citiți GetValue write SetValue;
protejate // Această secțiune este disponibilă pentru clasele copilului
public // Această secțiune este disponibilă în orice modul