íåêîòîðûõ ñëó÷àÿõ âîçíèêàåò íåîáõîäèìîñòü â íàïèñàíèè ïîäïðîãðàìì, êîòîðûå âûïîëíÿþò îäèíàêîâûå ëîãè÷åñêèå äåéñòâèÿ, íî íàä ïåðåìåííûìè ðàçíûõ òèïîâ äàííûõ.
 ÿçûêå Delphi ñóùåñòâóåò âîçìîæíîñòü äàòü äâóì è áîëåå ïðîöåäóðàì (ôóíêöèÿì) îäèíàêîâûå èäåíòèôèêàòîðû ïðè óñëîâèè, ÷òî âñå òàêèå ïðîöåäóðû (ôóíêöèè) îòëè÷àþòñÿ ñïèñêîì ïàðàìåòðîâ. Òàêàÿ âîçìîæíîñòü íàçûâàåòñÿ ïåðåãðóçêîé. Äëÿ óêàçàíèÿ òîãî, ÷òî ïðîöåäóðà (ôóíêöèÿ) ïåðåãðóæåíà, ñëóæèò ñòàíäàðòíàÿ äèðåêòèâà overload:
procedure Increment(var Value: Integer); overload;
procedure Increment(var Value: Real); overload;
Êàêóþ èìåííî ïðîöåäóðó èñïîëüçîâàòü â òîì èëè èíîì ñëó÷àå êîìïèëÿòîð áóäåò îïðåäåëÿòü íà ýòàïå êîìïèëÿöèè ïðîãðàììû ïî òèïàì ôàêòè÷åñêèõ àðãóìåíòîâ, ïåðåäàâàåìûõ ïðè âûçîâå.
Ïðè ïåðåãðóçêå ïðîöåäóð è ôóíêöèé ñóùåñòâóåò îñîáåííîñòü, ñâÿçàííàÿ ñ öåëî÷èñëåííûìè òèïàìè äàííûõ. Äîïóñòèì, èìåþòñÿ äâå ïðîöåäóðû:
procedure Print(X: Shortint); overload; // ïðîöåäóðà 1
procedure Print(X: Longint); overload; // ïðîöåäóðà 2
Åñëè ìû ïîïðîáóåì âûçâàòü ïðîöåäóðó Print, óêàçàâ â êà÷åñòâå ôàêòè÷åñêîãî àðãóìåíòà öåëî÷èñëåííóþ êîíñòàíòó, òî óâèäèì, ÷òî âûáîð êîìïèëÿòîðîì âàðèàíòà ïðîöåäóðû çàâèñèò îò çíà÷åíèÿ êîíñòàíòû.
Ïîñêîëüêó â íûíåøíåé âåðñèè ñðåäû Delphi îáîáùåííûé òèï äàííûõ Integer ñîâïàäàåò ñ ôóíäàìåíòàëüíûì òèïîì äàííûõ Longint, ñëåäóþùèé âàðèàíò ïåðåãðóçêè ÿâëÿåòñÿ îøèáî÷íûì:
procedure Print(X: Integer); overload;
procedure Print(X: Longint); overload; // Îøèáêà!
Òàêàÿ æå îøèáêà âîçíèêàåò ïðè èñïîëüçîâàíèè ïîëüçîâàòåëüñêèõ òèïîâ äàííûõ, îïðåäåëåííûõ ÷åðåç îáùèé áàçîâûé òèï.
type
TMyInteger = Integer;
procedure Print(X: Integer); overload;
procedure Print(X: TMyInteger); overload; // Îøèáêà!
×òî äåëàòü â òåõ ñëó÷àÿõ, êîãäà òàêàÿ ïåðåãðóçêà ïðîñòî íåîáõîäèìà? Äëÿ ýòîãî ïîëüçîâàòåëüñêèé òèï äàííûõ íåîáõîäèìî ñîçäàâàòü ñ èñïîëüçîâàíèåì êëþ÷åâîãî ñëîâà type:
type
TMyInteger = type Integer;
procedure Print(X: Integer); overload;
procedure Print(X: TMyInteger); overload; // Ïðàâèëüíî
Ïåðåãðóæåííûå ïðîöåäóðû è ôóíêöèè äîëæíû èìåòü îäèíàêîâîå êîë÷èåñòâî ïåðåäàâàåìûõ ïåðåìåííûõ.
Çàïðåùàåòñÿ òàêæå ïåðåãðóæàòü ôóíêöèè, êîòîðûå îòëè÷àþòñÿ ëèøü òèïîì âîçâðàùàåìîãî çíà÷åíèÿ.
function SquareRoot(X: Integer): Single; overload;
function SquareRoot(X: Integer): Double; overload; // Îøèáêà!
|