Справочник MQL4 Основы языка Функции Перегрузка функций
Перегрузка функцийОбычно в названии функции стремятся отобразить ее основное назначение. Читабельные программы, как правило, содержат разнообразные и грамотно подобранные идентификаторы. Иногда различные функции используются для одних и тех же целей. Например, рассмотрим функцию, которая вычисляет среднее значение массива чисел двойной точности, и такую же функцию, но оперирующую массивом целых чисел. И ту, и другую удобно назвать AverageFromArray:
Каждая функция содержит вывод сообщения посредством функции Print();
Компилятор выбирает нужную функцию в соответствии с типами аргументов и их количеством. Правило, по которому осуществляется этот выбор, называется алгоритмом соответствия сигнатуре. Под сигнатурой понимается список типов, который используется в объявлении функции. Пример:
Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами. Это означает, что в перегружаемых вариантах функции разным должно быть количество аргументов и/или их тип. Выбор конкретного варианта функции зависит от типов аргументов, полученных функцией. Конкретная функция выбирается в зависимости от соответствия списка аргументов при вызове функции списку параметров в объявлении функции. Когда вызывается перегруженная функция, компилятор должен иметь алгоритм для выбора надлежащей функции. Алгоритм, который выполняет этот выбор, зависит от того, преобразования какого типа присутствуют. Наилучшее соответствие должно быть уникальным. Найденная функция должна быть наилучшим выбором среди остальных вариантов хотя бы по одному аргументу, и, в то же время, по остальным аргументам она должна подходить не хуже остальных. Ниже приведен алгоритм соответствия для каждого аргумента. Алгоритм выбора перегруженной функции
Стандартное повышение типа лучше, чем остальные стандартные преобразования. Повышение - это преобразование float в double, а также bool, char, short или enum в int. Кроме того, к стандартным преобразованиям относятся преобразования массивов похожих целых типов. Похожими типами являются: bool, char, uchar, так как все три типа являются однобайтовыми целыми; двубайтовые целые short и ushort; 4-байтовые целые int, uint и color; long, ulong и datetime. Несомненно, строгое соответствие является наилучшим. Для достижения такого соответствия могут использоваться приведения. Компилятор не справится с двусмысленной ситуацией. Поэтому не следует полагаться на тонкие различия в типах и неявные преобразования, которые делают перегруженную функцию неясной. Если вы сомневаетесь, используйте явные преобразования для обеспечения строгого соответствия. Примеры перегруженных функций в MQL4 вы можете увидеть на примере функций ArrayInitialize(). Правила перегрузки функций применимы к перегрузке методов классов.
Перегрузка системных функций допускается, но при этом следует следить за тем, чтобы компилятор точно мог выбрать нужную функцию. Для примера, мы можем перегрузить системную функцию MathMax() 4-мя различными способами, но только два варианта будут корректными. Пример:
Смотри также Перегрузка, Виртуальные функции, Полиморфизм |