AutoIt/Funkcje polimorficzne
Co to jest polimorfizm?
edytujPolimorfizm (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
edytujFunkcje 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
edytujPonieważ 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