Metoda Przeciążenie i domyślne parametry w Delphi

click fraud protection

Funkcje i procedury są ważną częścią języka Delphi. Począwszy od Delphi 4, Delphi pozwala nam pracować z funkcjami i procedurami, które obsługują domyślne parametry (tworzenie parametry opcjonalne) i pozwala dwóm lub więcej procedurom mieć identyczne nazwy, ale działają zupełnie inaczej rutyny.

Zobaczmy, jak przeciążenie i parametry domyślne mogą pomóc Ci lepiej kodować.

Przeciążenie

Mówiąc najprościej, przeciążenie deklaruje więcej niż jedną procedurę o tej samej nazwie. Przeładowanie pozwala nam mieć wiele procedur o tej samej nazwie, ale z inną liczbą parametrów i typów.

Jako przykład rozważmy następujące dwie funkcje:

{Przeciążone procedury muszą zostać zadeklarowane. z dyrektywą dotyczącą przeciążenia}funkcjonować SumAsStr (a, b: integer): strunowy; przeciążać; zaczynać Wynik: = IntToStr (a + b); koniec; funkcjonować SumAsStr (a, b: rozszerzona; Cyfry: liczba całkowita): strunowy; przeciążać; zaczynać Wynik: = FloatToStrF (a + b, ffFixed, 18, Cyfry); koniec; 

Te deklaracje tworzą dwie funkcje, obie zwane SumAsStr, które przyjmują inną liczbę parametrów i są dwóch różnych typów. Kiedy wywołujemy przeciążoną procedurę, kompilator musi być w stanie określić, którą procedurę chcemy wywołać.

instagram viewer

Na przykład SumAsStr (6, 3) wywołuje pierwszą funkcję SumAsStr, ponieważ jej argumenty mają wartość całkowitą.

Uwaga: Delphi pomoże wybrać właściwą implementację za pomocą uzupełniania kodu i wglądu w kod.

Z drugiej strony rozważ, czy spróbujemy wywołać funkcję SumAsStr w następujący sposób:

 SomeString: = SumAsStr (6.0,3.0) 

Otrzymamy błąd o treści: „nie ma przeciążonej wersji „SumAsStr”, którą można by wywołać za pomocą tych argumentów.„Oznacza to, że powinniśmy również dołączyć parametr Cyfry używany do określania liczby cyfr po przecinku.

Uwaga: Podczas pisania przeciążonych procedur istnieje tylko jedna reguła: przeciążona procedura musi różnić się co najmniej jednym typem parametru. Zamiast tego typu zwracanego nie można użyć do rozróżnienia dwóch procedur.

Dwie jednostki - jedna rutyna

Powiedzmy, że mamy jedną procedurę w jednostce A, a jednostka B używa jednostki A, ale deklaruje procedurę o tej samej nazwie. Deklaracja w jednostce B nie wymaga dyrektywy o przeciążeniu - powinniśmy użyć nazwy jednostki A, aby zakwalifikować połączenia do wersji procedury A z jednostki B.

Rozważ coś takiego:

jednostka B;... wykorzystuje ZA;... procedura RoutineName; zaczynać Wynik: = A.RoutineName; koniec; 

Alternatywą dla korzystania z przeciążonych procedur jest użycie parametrów domyślnych, co zwykle skutkuje mniejszym kodem do napisania i utrzymania.

Parametry domyślne / opcjonalne

Aby uprościć niektóre instrukcje, możemy podać domyślną wartość parametru funkcji lub procedury, a także możemy wywołać procedurę z parametrem lub bez, dzięki czemu będzie on opcjonalny. Aby podać wartość domyślną, zakończ deklarację parametru symbolem równości (=), a następnie stałym wyrażeniem.

Na przykład biorąc pod uwagę deklarację

funkcjonować SumAsStr (a, b: rozszerzona; Cyfry: liczba całkowita = 2): strunowy; 

następujące wywołania funkcji są równoważne.

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

Uwaga: Parametry z wartościami domyślnymi muszą występować na końcu listy parametrów i muszą być przekazywane przez wartość lub jako const. Parametr referencyjny (var) nie może mieć wartości domyślnej.

Podczas wywoływania procedur z więcej niż jednym domyślnym parametrem nie możemy pominąć parametrów (jak w VB):

funkcjonować SkipDefParams (var Odp.: ciąg; B: liczba całkowita = 5, C: boolean = False): boolean;... // to wywołanie generuje komunikat o błędzie
CantBe: = SkipDefParams („delphi”,, True); 

Przeciążenie parametrami domyślnymi

W przypadku przeciążenia funkcji lub procedury i parametrów domyślnych nie wprowadzaj niejednoznacznych rutynowych deklaracji.

Rozważ następujące deklaracje:

procedura DoIt (A: rozszerzony; B: liczba całkowita = 0); przeciążać; procedura DoIt (A: rozszerzony); przeciążać; 

Wywołanie procedury DoIt takiej jak DoIt (5.0) nie kompiluje się. Z powodu domyślnego parametru w pierwszej procedurze instrukcja ta może wywoływać obie procedury, ponieważ nie można stwierdzić, która procedura ma zostać wywołana.

instagram story viewer