ПредишенСледващото

Претоварването процедури и функции
В някои случаи е необходимо да се напише съчетания, които изпълняват същите логически операции, а на променливите на различни типове данни. Например:

процедура IncrementInteger (Var стойност: цяло число);
процедура IncrementReal (VAR Стойност: Реал);

На езика Делфи, че е възможно да се даде две или повече процедури (функции) на едни и същи идентификатори, при условие че всички тези процедури (функции) са друг списък параметър. Тази функция се нарича претоварване. За да покаже, че процедурата (функция) е претоварена, това е стандарт директива претоварване. С помощта на горния пример може да бъде пренаписана, както следва:

Увеличаване процедура (Var стойност: цяло число); претоварване; // Процедура 1
процедура Инкремент (VAR Стойност: Реал); претоварване; // процедура 2

Каква е процедурата да се използва във всеки конкретен случай, компилаторът ще определи най-тип по време на компилацията на действителните аргументи преминали в поканата.

Var
X: цяло число;
Y: Real;
започвам
X: = 1;
Y: = 2.0;
Увеличаване (X); // наречената процедура 1
Увеличаване (Y); // наречената процедура 2
край.

Когато претоварване на процедури и функции, там е функция, свързана с целочислени типове данни. Да предположим, че има две процедури:

процедура печат (X: Shortint); претоварване; // Процедура 1
процедура печат (X: Longint); претоварване; // процедура 2

Ако се опитаме да се обадя на процедурата за печат, като посочи като действителен аргумент в константа число, ние виждаме, че изборът на опции на компилатора на процедурата зависи от стойностите на константите.

Печат (5); // наречената процедура 1
Печат (150); // наречената процедура 2
Print (-500); // наречената процедура 2
Печат (-1); // наречената процедура 1

Очевидно е, че същият брой може да се тълкува като Longint и как Shortint (например, номера 5 и 1). Състав логика в тези случаи е, че ако действителната стойност на параметъра, попада в рамките на диапазон от стойности на няколко вида, за който има претоварване, компилаторът избира protseuduru (функция), в която тип параметър има по-малък диапазон от стойности. Например, покана печат (5) ще означава, че процедурата на повикване опция, която е параметър тип Shortint. Но разговор печат (150), ще означава, че процедурата за кол-опция, която има вид параметър Longint, тъй като 150 брой не се вписва в стойностите за типовете данни гама Shortint.

Тъй като сегашната версия Delphi средни обобщения Цяло число тип данни съответства на основните данни тип Longint следния вариант за претоварване е иронично:

процедура печат (X: цяло число); претоварване;
процедура печат (X: Longint); претоварване; // Грешка!

Същата грешка възниква при използване на потребителски дефинирани типове данни чрез обща база тип.

тип
TMyInteger = цяло число;

процедура печат (X: цяло число); претоварване;
процедура печат (X: TMyInteger); претоварване; // Грешка!

Какво да се прави в случаите, когато е абсолютно необходимо този трансфер? За тази дефинирани от потребителя тип данни трябва да бъдат създадени с помощта на типа на ключова дума:

тип
TMyInteger = тип цяло число;

процедура печат (X: цяло число); претоварване;
процедура печат (X: TMyInteger); претоварване; // дясно

Трябва да се отбележи, че при използване на претоварени процедури (функции), които имат параметри, които имат стойности по подразбиране, трябва да бъдат много внимателни, защото може да има ситуации, когато компилаторът просто няма да знаят какъв вид процедура (функция), които искате да се обадите. Например:

Увеличаване процедура (Var стойност: Real; Delta: Real = 1.0); претоварване; // Процедура 1
процедура Инкремент (VAR Стойност: Реал); претоварване; // процедура 2

Покана процедура Инкремент с един параметър ще доведе до неяснота:

Var
X: Real;
започвам
Увеличаване (X, 10); // наречената процедура 1
Увеличаване (X); // Грешка! неяснота
край.

Също така е забранено да се претовари функции, които се различават само по връщания тип.

функция SquareRoot (X: цяло число): Единична; претоварване;
функция SquareRoot (X: цяло число): Двойна; претоварване; // Грешка!

Свързани статии

Подкрепете проекта - споделете линка, благодаря!