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