Metodes pārslodze un noklusējuma parametri Delphi

click fraud protection

Funkcijas un procedūras ir svarīga delfu valodas sastāvdaļa. Sākot ar Delphi 4, Delphi ļauj mums strādāt ar funkcijām un procedūrām, kas atbalsta noklusējuma parametrus (veidojot parametri nav obligāti) un ļauj divām vai vairākām rutīnām iegūt identisku vārdu, bet darbojas kā pilnīgi atšķirīgas rutīnas.

Apskatīsim, kā pārslodze un noklusējuma parametri var palīdzēt labāk kodēt.

Pārslodze

Vienkārši sakot, pārslodze deklarē vairāk nekā vienu rutīnu ar tādu pašu nosaukumu. Pārslodze ļauj mums izmantot vairākas rutīnas, kurām ir vienāds nosaukums, bet ar atšķirīgu parametru un veidu skaitu.

Piemēram, ņemsim vērā šādas divas funkcijas:

{Pārslogotās rutīnas ir jādeklarē. ar pārslodzes direktīvu}funkcija SumAsStr (a, b: vesels skaitlis): virkne; pārslodze; sākt Rezultāts: = IntToStr (a + b); beigas; funkcija SumAsStr (a, b: pagarināts; Cipari: vesels skaitlis): virkne; pārslodze; sākt Rezultāts: = FloatToStrF (a + b, ffFixed, 18, cipari); beigas; 

Šīs deklarācijas rada divas funkcijas, kuras abas sauc par SumAsStr, kurām ir atšķirīgs parametru skaits un kuras ir divi dažādi veidi. Kad mēs saucam par pārslogotu rutīnu, kompilatoram jāspēj pateikt, kuru rutīnu mēs vēlamies izsaukt.

instagram viewer

Piemēram, SumAsStr (6, 3) izsauc pirmo SumAsStr funkciju, jo tās argumenti tiek vērtēti ar veselu skaitli.

Piezīme: Delphi palīdzēs jums izvēlēties pareizo ieviešanu, izmantojot koda aizpildīšanu un ieskatu kodā.

No otras puses, apsveriet, vai mēs mēģinām izsaukt funkciju SumAsStr šādi:

 SomeString: = SumAsStr (6.0,3.0) 

Mēs saņemsim kļūdu, kas skan šādi: "nav pārslogotas 'SumAsStr' versijas, kuru varētu izsaukt ar šiem argumentiem."Tas nozīmē, ka mums jāiekļauj arī parametrs Cipari, ko izmanto, lai norādītu ciparu skaitu aiz komata.

Piezīme: Rakstot pārslogotas rutīnas, ir tikai viens noteikums, proti, pārslogotai rutīnai ir jābūt atšķirīgai vismaz vienā parametru tipā. Tā vietā atgriešanās veidu nevar izmantot, lai atšķirtu divas kārtības.

Divas vienības - viena rutīna

Teiksim, ka mums ir viena rutīna vienībā A, un vienība B izmanto vienību A, bet deklarē rutīnu ar tādu pašu nosaukumu. B vienības deklarācijai nav nepieciešama pārslodzes direktīva - mums vajadzētu izmantot vienības A vārdu, lai kvalificētu izsaukumus uz A rutīnas versiju no B vienības.

Apsveriet kaut ko līdzīgu šim:

vienība B;... izmanto A;... procedūra Rutīnas vārds; sākt Rezultāts: = A.RoutineName; beigas; 

Alternatīva pārslogoto rutīnu lietošanai ir noklusējuma parametru izmantošana, kas parasti rada mazāk koda rakstīšanas un uzturēšanas kodu.

Noklusējuma / izvēles parametri

Lai vienkāršotu dažus apgalvojumus, mēs varam piešķirt noklusējuma vērtību funkcijas vai procedūras parametram, un mēs varam izsaukt rutīnu ar parametru vai bez tā, padarot to pēc izvēles. Lai sniegtu noklusējuma vērtību, parametru deklarēšanu beidziet ar simbolu (=), kam seko nemainīga izteiksme.

Piemēram, ņemot vērā deklarāciju

funkcija SumAsStr (a, b: pagarināts; Cipari: vesels skaitlis = 2): virkne; 

šādi funkciju izsaukumi ir līdzvērtīgi.

 SumAsStr (6.0, 3.0) 
 SumAsStr (6.0, 3.0, 2) 

Piezīme: Parametriem ar noklusējuma vērtībām jāparādās parametru saraksta beigās, un tie jāpāriet pēc vērtības vai kā const. Atsauces (var) parametram nevar būt noklusējuma vērtība.

Izsaucot rutīnas ar vairāk nekā vienu noklusējuma parametru, mēs nevaram izlaist parametrus (piemēram, VB):

funkcija SkipDefParams (var A: aukla; B: vesels skaitlis = 5, C: Būla = Viltus): Būla;... // šis zvans ģenerē kļūdas ziņojumu
CantBe: = SkipDefParams ('delphi', True); 

Pārslodze ar noklusējuma parametriem

Izmantojot gan funkciju, gan procedūras pārslodzi un noklusējuma parametrus, neieviesiet divdomīgas ikdienas deklarācijas.

Apsveriet šādus paziņojumus:

procedūra Darīt (A: pagarināts; B: vesels skaitlis = 0); pārslodze; procedūra Darīt (A: pagarināts); pārslodze; 

Aicinājums uz DoIt procedūru, piemēram, DoIt (5.0), netiek apkopots. Pirmajā procedūrā izmantotā noklusējuma parametra dēļ šis paziņojums var izsaukt abas procedūras, jo nav iespējams pateikt, kura procedūra ir paredzēta.

instagram story viewer