Blog gunsmoker (traduceri) metode virtuale și moștenit

Metode virtuale și moștenite

Delphi are un suport lingvistic neobișnuit de bogat pentru comportamentul polimorf. Cele mai simple și cele mai elementare, pe care majoritatea programatorilor le asociază cu polimorfismul, sunt metode virtuale.







O metodă virtuală este declarată în clasa de bază utilizând directiva virtuală. O clasă de bază poate avea o implementare implicită pentru o metodă virtuală sau poate nu. Dacă nu există o implementare implicită, atunci marcați metoda ca abstract (directivă abstractă), forțând moștenitorii de clasă să creeze fără întârziere implementarea metodei. Toate acestea sunt lucrurile de bază pe care toți programatorii Delphi le cunosc. În funcție de punerea în aplicare (și documentația!) Clasa de baza, care moștenește de la clasa poate decide pentru a apela metoda moștenită de la început, înainte de punerea în aplicare a acțiunilor, sau la mijloc (rar) sau după acțiunile lor, în cele din urmă, sau nu provoca toate . Există două moduri de a apela varianta metodei moștenite, cu diferențe subtile: Acest cod va apela cu siguranță metoda moștenită de trasare a clasei de bază. Dacă metoda în clasa de bază - abstractă, apelul eșuează, excepția EAbstractError interesant în timpul execuției (sau eroare Run-Time 210 dacă nu folosiți excepții).

O sintaxă de apel alternativă este pur și simplu de a scrie moștenit; de exemplu: Acest cod va funcționa la fel ca cel precedent pentru cazurile în care clasa de bază nu conține o metodă abstractă. Acest cod este, de asemenea, generat automat de instrumentul de completare automată a codului când implementați o suprascriere a metodei. În plus, este folosit și de IDE, atunci când inserați manipulatorii de evenimente pentru formulare cu moștenire vizuală.

Dacă metoda de clasă de bază este abstractă, sau ca clasa de bază nu conține o metodă (pentru metode non-virtuale), apelul devine noop moștenit (nr-operation - Lăsați operatorul). Compilatorul nu generează cod pentru el (și, prin urmare, nu puteți pune un punct de întrerupere pe el). Acest mecanism face parte din stabilitatea excelentă a versiunii în limbajul Delphi.







O capcană cu sintaxa moștenită; - Nu este acceptat pentru funcții. Pentru funcții, trebuie să utilizați o sintaxă explicită cu numele metodei și argumentele acesteia. De exemplu: aceasta ar putea părea o limitare excesivă a designului limbajului Delphi, dar cred că nu este un accident. Semnificația acestui fapt este, probabil, că, dacă TMyClass.MethodC este abstractă (sau se va face în mod abstract viitoare), rezultatul de atribuire în clasa descendent rezultatul apelului va fi eliminat, ceea ce va duce la o valoare nedefinită neașteptată. Acest lucru, desigur, va duce la bug-uri ascunse în cod.

Cu toate acestea, cred că există un mic decalaj în sintaxa apelului moștenit. În multe moduri, o procedură care preia parametrii (și, în unele cazuri, parametrii var) se comportă ca o funcție care returnează un rezultat. Deci, în opinia mea, sintaxa este moștenită; ar trebui să fie dezactivat atunci când apelați metode cu parametrii out (și, eventual, var). Acum nu este așa. Acest cod înseamnă că, dacă metoda clasei părinte este abstractă (sau pur și simplu absentă în cazul unei metode non-virtuale), atunci valoarea parametrului de ieșire va fi nedefinită. În opinia mea, compilatorul ar trebui să interzică astfel de apeluri moștenite; care necesită sintaxă explicită Metoda B (A); Dar pisica este deja eliberat din sac și este prea târziu pentru a schimba ceva - blocarea unor astfel de apeluri cu erori de compilare cu siguranță va rupe o grămadă de cod, așa că, probabil, atrage un număr maxim de avertizare (avertizare).

Nu știam cum să utilizez virtual * oops *

Vă mulțumim pentru articolul dvs. de înțeles. )

O capcană cu sintaxa moștenită; - Nu este acceptat pentru funcții. Pentru funcții, trebuie să utilizați o sintaxă explicită cu numele metodei și argumentele acesteia
Sincer - pentru prima dată am auzit despre asta. Am folosit această sintaxă în D7, iar acum în XE - fără restricții. Și chiar exemplul dvs. este perfect compilat și funcționează conform așteptărilor

În măsura în care înțeleg, aceasta este o copie a vechiului articol din Revista Delphi (poate fi greșit, desigur). Dar, în orice caz, originalul a fost scris, aparent, pentru o lungă perioadă de timp. Dacă nu confund, atunci acest comportament a fost înainte de Delphi 4 inclusiv, iar în Delphi 5 a fost eliminat.

Textul a decis să plece pentru a cunoaște o problemă a unei metode abstracte-funcție. Deși acum înțeleg că trebuie să adaug o notă.

O capcană cu sintaxa moștenită; - Nu este acceptat pentru funcții.
În Delphi XE este cazul. Trebuie să scriu vlob:
Rezultat: = moștenit;
În caz contrar, valoarea din clasa de bază nu este trecută.

Puteți utiliza anumite etichete HTML, de exemplu:

Utilizați "Nume / URL" în loc de "Anonim" dacă este posibil. Pur și simplu nu puteți specifica o adresă URL.

Mesajul dvs. poate fi marcat ca spam de un filtru de spam - nu vă faceți griji, acesta va apărea după ce acesta a verificat-o.

Blogul de căutare







Trimiteți-le prietenilor: