Dupa ce a citit titlul, ai citit acest drept - a opta versiune a Delphi (Delphi.NET) acum devin într-adevăr posibil pentru a supraîncărca operatorii. Odată cu lansarea Delphi.NET în Object Pascal limbaj, există mai multe schimbări de limbă, cele mai semnificative de la versiunea 1.0. Pentru a le vedea pe toate ar necesita o carte separată, astfel încât în acest articol ne vom uita la doar un singur lucru, în opinia mea, cea mai interesantă extensie a limbajului - Reacoperirea.
Posibilitatea de înlocuire automată a operatorilor în codul sursă al programului funcțiile definite de utilizator au fost mult timp familiar programatori scris în C ++ și C #. Acum, această oportunitate minunata disponibile și Delphi-programatori.
reguli generale
În Delphi.NET, spre deosebire de limbaje ca-C, cum ar fi C ++ și C #, pentru a supraîncărca necesitatea de a pune în aplicare o funcție cu o semnătură specifică (și nu cu simbolul operatorului!) - adică, să pună în aplicare o funcție cu un anumit nume, număr și tipuri de parametri. Tabelul 1 prezintă o listă de operatori, ceea ce a permis o modificare și funcțiile de date de semnături aceasta trebuie să pună în aplicare.
Tabelul 1. Lista operatorilor pentru care o posibilă supraîncărcare Delphi.NET
Este interesant de observat că aceste funcții utilizate frecvent, cum ar fi rotundă și Trunc sunt operatori Delphi.NET, adică forma apelul nu este diferit de funcții, dar poate fi copleșit.
După aceea, în programul poate folosi următorul cod:
În continuare, considerăm o suprasarcină mai detaliat pentru diferitele grupuri de operatori
Supraîncărcarea Operatorii unari
Operatorii unari primesc la intrare un argument, și ca urmare a returna o instanță a unui anumit tip. În general, tipul de parametru de intrare, iar rezultatul poate fi același tip de operator.
Luați în considerare exemplul unei astfel de operator de unar: Să presupunem că avem un tip: liniile extinse ale listei sub formă de clasă TMyStringList moștenit de la clasa de bibliotecă TStringList VCL:
Pentru această clasă, dorim să determinăm operatorul negație aritmetică „-“. Lăsați operatorul va produce o reordonare a elementelor dintr-o listă, în ordine inversă, adică primul element devine ultimul, iar al doilea - penultima, etc. Ca urmare a acestui fapt, operatorul trebuie să returneze noua lista de rezultate.
Pentru a pune în aplicare un astfel de operator trebuie să declare următoarea metodă de clasă:
Pentru a demonstra acest exemplu, creați o mică aplicație consolă. Codul sursa completa este după cum urmează:
Supraîncărcarea binari
Un operator binar este o funcție care are două argumente și returnează rezultatul ca o instanță a unui anumit tip. În ceea ce privește operatorii unari, tipurile de parametri de intrare și de tipul de retur al operatorului poate fi, de asemenea, la fel.
Să considerăm un exemplu de un astfel de operator binar: pentru clasa noastră TMyStringList definesc operatorul operator de aritmetică cu un șir de „+“, care se va adăuga această linie la sfârșitul listei.
Pentru a pune în aplicare un astfel de operator trebuie să declare următoarea metodă:
In exemplul de mai sus, pentru ilustrare, conversia se realizează la tipuri primitive (String, întreg, Boolean), într-o aplicație reală poate aduce la o clasă de arbitrar. De exemplu, o instanță de a aduce TAccount (cont bancar) de tipul TConractor (contraparte) poate returna titularului de cont, și să aducă la Real va returna soldul contului.
Redefinesc operatorii de tip Cast este un mecanism foarte puternic, și este necesar să-l folosească cu precauție, planificare atentă o posibilă transformare - în special conversia implicită. În caz contrar, aceasta poate duce la dificil de detectat bug-uri.
caracteristici avansate
La încheierea poveștii am vrut să-ți spun despre oportunitățile interesante care oferă Reacoperirea.
Crearea unui constructor copy
Ideea este de a defini o instanță explicită operatorului de conversie a clasei la aceeași clasă.
Operatorului de asignare
Dacă te uiți lista îndeaproape urmărit de operatori, care pot supraincarca, vă rugăm să rețineți că nu există nici un operator de atribuire. Într-adevăr, supraîncărcarea operatorului de atribuire „: =“ este interzisă.
Cu toate acestea, într-un caz, acest lucru se poate realiza: atunci când se utilizează clase care au întotdeauna o singură instanță. Un exemplu de un astfel de exemplu este o variabilă de tip Application TApplication VCL bibliotecă. Pot exista doar o singură instanță a TApplication de clasă, și este o variabilă globală; crearea și distrugerea acesteia se realizează în biblioteca VCL și în mod automat.
Deci, pentru astfel de obiecte este posibilă supraîncărcare implicită a operatorului de atribuire.
Pentru acest exemplu, a clasei este declarată câmpul static din aceeași clasă, și el a blocat operatorul să aducă la tipul dorit. Crearea unui astfel de câmp este posibilă în constructorul clasei. Ulterior, devine posibil să suprascrie atribuirea unei instanțe arbitrare a acestei clase la instanța curentă.
Să ne ilustrează exemplul de mai sus: în cererea noastră a implementat un tranzacții de registru sub forma unui fișier text (fișier log-). Acest fișier jurnal este reprezentat ca un logger de clasă. întotdeauna există doar o instanță a acestei clase, și toate modulele de aplicații apelează la acesta pentru a înregistra un alt mesaj.
Acum devine posibil să se atribuie linie de operare (string) Logger variabilă.
concluzie
Am considerat exemple de Reacoperirea în Delphi.NET. Utilizarea corectă a acestei caracteristici puternice vă va permite să facă codul mai ușor de citit și de a facilita înțelegerea altor dezvoltatori și susținerea în continuare a acesteia.
Toate codul de mai sus exemple puteți descărca de la acest link.