Перегрузка функций

В главе про конструкторы я уже упоминал про перегрузку функций. Перегрузка функций не означает вывод чего-либо из строя. Напротив это очень полезная опция, употребляемая тогда, когда кол-во и тип параметров, посылаемых в процедуру или в функцию, может быть разным. Так же может применяться и для возврата разных типовых значений.
Перегрузку функций можно осуществлять двумя способами. Первый из них может работать только с функциями конвенции вызова 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. Однако есть более слабые языки с примитивным синтаксисом, поэтому, если вам нужно создать универсальную библиотеку для всех языков, то наверно не стоит использовать данную опцию.

Всего доброго!

содержание | назад | вперед