AutoIt/Funkcje polimorficzne

Co to jest polimorfizm? edytuj

Polimorfizm (z gr. polymorfismos - wielopostaciowość) - mechanizmy pozwalające programiście używać wartości, zmiennych, operatorów i podprogramów na kilka różnych sposobów.

W AutoIt polimorfizm dotyczy w zasadzie tylko funkcji, chociaż jest jeden polimorficzny operator. To operator =, który w zależności od kontekstu jest operatorem przypisania lub relacji.

Funkcje polimorficzne edytuj

Funkcje polimorficzne, to takie funkcje, które mogą operować na argumentach różnego typu.

Sposób działania funkcji jest zależny od typu przekazanych do niej argumentów.

Tak więc funkcja o takiej samej nazwie będzie realizowała inne działanie gdy argumenty będą np. stringami, a inne gdy będą liczbami.

Tworzenie funkcji polimorficznych w Autoit edytuj

Ponieważ Autoit nie kontroluje typu danych przekazywanych do funkcji, bardzo łatwo można tworzyć funkcje polimorficzne.

Do funkcji przekazujemy argumenty dowolnego typu, a ich typ rozpoznajemy wewnątrz funkcji. Dla każdego rozpoznanego typu należy utworzyć osobny kod.

Prześledźmy to na przykładzie funkcji podwojenie. Obsługuje ona argumenty trzech typów:

- dla argumentu liczbowego zwraca jego wartość pomnożoną przez 2

- dla stringu zwraca nowy string będący połączeniem dwóch stringów argumentu

- dla tablicy jednowymiarowej zwraca inną tablicę jednowymiarową o podwójnej długości, nowe komórki mają powielone wartości ze starych

Tak więc zamiast trzech funkcji podwojenie_liczby, podwojenie_stringu i podwojenie_tablicy, mamy tylko jedną.

Wprawdzie wewnętrznie istnieją trzy implementacje polecenia podwojenie , ale nazwanie ich wspólną nazwą tworzy wygodny abstrakcyjny interfejs niezależny od typu przetwarzanej wartości.

Przykład funkcji polimorficznej:

#include<array.au3>

MsgBox(0,"Liczba:",podwojenie(2))
MsgBox(0,"Liczba:",podwojenie("Ala ma Asa"))
Dim $aArray[3]=[1, 2, 3]
$aArray = podwojenie($aArray)
_ArrayDisplay($aArray)

;funkcja polimorficzna "podwojenie"
Func podwojenie ($vVar)
   Select
      Case IsNumber($vVar)
         Return 2*$vVar
      Case IsString($vVar)
         Return $vVar&$vVar
      Case IsArray($vVar)
         $iSize=UBound($vVar)
         ReDim $vVar[2*$iSize]
         For $i=0 to $iSize-1
            $vVar[$i+$iSize]=$vVar[$i]
         Next
        Return $vVar
   EndSelect
EndFunc