Перегрузка функций
В главе про конструкторы я уже упоминал про перегрузку функций. Перегрузка
функций не означает вывод чего-либо из строя. Напротив это очень полезная опция,
употребляемая тогда, когда кол-во и тип параметров, посылаемых в процедуру или в
функцию, может быть разным. Так же может применяться и для возврата разных
типовых значений.
Перегрузку функций можно осуществлять двумя способами.
Первый из них может работать только с функциями конвенции вызова CDECL. Для его
осуществления нужно:
- вызывать функцию с ключевым словом cdecl
- в первом параметре указывать общее кол-во передаваемых параметров
- использовать специальные операторы:
- va_first (указатель на первый параметр)
- va_next (указатель на следующий параметр)
- va_arg ( значение в
параметре)
Пример:
Sub Avg Cdecl (Count As Integer, ... ) Dim ARG As Any Ptr ARG = Va_first() ? Va_arg(ARG, Double) ARG = Va_next(ARG,Double) ? Va_arg(ARG, Double) End Sub AVG (2, 3.4,5.1) Sleep
Ничего хитрого в примере нет. Вызываем процедуру с двумя параметрами,
имеющими тип double. Поскольку параметров два, мы это и указываем в первом
передаваемом параметре. В самой процедуре, получаем указатель на первый параметр
с помощью va_first , далее получаем значение по этому указателю с помощью
va_arg. Затем получаем указатель на следующий параметр с помощью va_next. И
конечно же с помощью va_arg получаем его значение.
Второй способ я считаю более универсальным, а так же более употребляемым. Его
принцип схож с принципом, который мы рассматривали в главе с
конструкторами.
Создаются нужное кол-во функций или процедур с разными
кол-вами или типами параметров. Так же у этих функций может различное
возвращаемое значение. Все зависит от того, что передается при вызове. Для
осуществления второго способа нужно:
- имена функций или процедур должны быть одинаковы
- использовать ключевое слово Overload у одной из функций (можно у всех)
Пример:
Sub one Overload(a As Integer) ? "integer parameters" End Sub Sub one(a As String) ? "String parameters" End Sub Function one() As String Return "no parameters" End Function one(2) one("AAAA") ? one Sleep
В примере выше, я применил возможность перегрузки для того, чтобы узнать,
какой тип передается функции. В этом примере три перегруженных функции. Первая
получает в параметре целочисленный тип , вторая строку и третья вообще без
параметров. Я думаю тут все прозрачно. Что передадим при вызове, такая функция и
будет вызвана.
Напоследок хотелось бы сказать, что применяя данную
возможность при разработке библиотек для других языков программирования, нужно
помнить о том, что не все языки умеют это. Так общеизвестные и мощные
языки: С , C++, Pascal, Visual Basic, PowerBasic, Delphi имеют во
встроенных средствах такую возможность. Человек, программируя на вышеописанных
языках, легко сможет использовать любую созданную библиотеку на языке FreeBasic.
Однако есть более слабые языки с примитивным синтаксисом, поэтому, если вам
нужно создать универсальную библиотеку для всех языков, то наверно не стоит
использовать данную опцию.
Всего доброго!
содержание | назад | вперед