W tym artykule dowiesz się o przeciążaniu funkcji, kiedy potrzebujemy przeciążania funkcji i jak przeciążać się przykładami.
Dwie lub więcej funkcji o tej samej nazwie, ale różnych argumentach nazywamy funkcjami przeciążonymi.
Dlaczego potrzebujemy przeciążania funkcji?
Wyobraź sobie, że tworzysz strzelankę, w której gracz może atakować wrogów za pomocą noża, ostrza i pistoletu. Rozwiązaniem dla funkcji ataku może być zdefiniowanie działań w funkcje takie jak:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Ale kiedy spróbujesz uruchomić powyższy program, otrzymasz błąd czasu kompilacji w Swift jako „attack ()” wcześniej zadeklarowany tutaj . Jednak innym rozwiązaniem może być zdefiniowanie różnych nazw funkcji dla poszczególnych funkcji, takich jak:
struct Knife ( ) struct Gun ( ) struct Blade ( ) func attackUsingKnife(weapon:Knife) ( //… print("Attacking with Knife") ) func attackUsingBlade(weapon:Blade) ( //… print("Attacking with Blade") ) func attackUsingGun(weapon:Gun) ( //… print("Attacking with Gun") )
Nie martw się, jeśli nie wiesz, co to jest struktura. Na razie pomyśl o tym jako o czymś, co tworzy fizyczny obiekt w programowaniu, więc tworzysz nóż, pistolet i ostrze. Jeśli chcesz dowiedzieć się więcej, zobacz Swift Struct. Jeśli nie, wrócimy do tego w dalszych rozdziałach.
Jedynym problemem związanym z tym rozwiązaniem jest konieczność zapamiętania nazw funkcji, aby wywołać tę konkretną akcję ataku. Wraz ze wzrostem poziomu gracz może mieć dodatkowe funkcje do ataku za pomocą bomby, granatu, strzelby itp.
Tworzenie funkcji o różnych nazwach jest czasochłonne i zwiększa obciążenie związane z zapamiętywaniem nazwy funkcji w celu jej wywołania. W sumie nie jest to intuicyjne.
Byłoby znacznie lepiej, gdybyś mógł tworzyć różne funkcje o tej samej nazwie, ale różnej implementacji dla każdej broni. W ten sposób wystarczy zapamiętać jedną nazwę funkcji i nie musisz się martwić o nazwy funkcji dla innych broni.
Co to jest przeciążanie funkcji?
Proces, który właśnie opisaliśmy, jest znany jako przeciążanie funkcji. Z definicji proces tworzenia dwóch lub więcej niż dwóch funkcji o tej samej nazwie, ale o różnej liczbie lub typach przekazywanych parametrów, nazywany jest przeciążaniem funkcji.
Zobaczmy to w poniższym przykładzie:
Przykład 1: Przeciążanie funkcji
struct Knife ( ) struct Gun ( ) struct Blade ( ) func attack(with weapon:Knife) ( print("Attacking with Knife") ) func attack(with weapon:Gun) ( print("Attacking with Gun") ) func attack(with weapon:Blade) ( print("Attacking with Blade") ) attack(with: Gun()) attack(with: Blade()) attack(with: Knife())
Po uruchomieniu powyższego programu wynik będzie:
Atakowanie bronią Atakowanie ostrzem Atakowanie nożem
W powyższym programie stworzyliśmy trzy różne funkcje o tej samej nazwie attack
. Jednak akceptuje różne typy parametrów. W ten sposób attack
wystarczy zapamiętać nazwę, aby wywołać funkcję.
- Wywołanie
attack(with: Gun())
wyzwala instrukcję wewnątrz funkcjifunc attack(with weapon:Gun)
. - Wywołanie
attack(with: Blade())
wyzwala instrukcję wewnątrz funkcjifunc attack(with weapon:Blade)
. - Instrukcja call
attack(with: Knife())
wewnątrz funkcjifunc attack(with weapon:Knife)
.
Przykład 2: Przeciążanie funkcji na podstawie różnych typów parametrów
func output(x:Int) ( print("The int value is (x)") ) func output(x:String) ( print("The string value is (x)") ) output(x: 2) output(x: "Swift")
Po uruchomieniu powyższego programu wynik będzie:
Wartość int to 2 Wartość ciągu to Swift
W powyższym programie mamy dwie funkcje o tej samej nazwie output()
i takiej samej liczbie parametrów. Jednak pierwsza output()
funkcja przyjmuje liczbę całkowitą jako parametr, a druga output()
funkcja przyjmuje String
jako parametr.
Podobnie jak w przykładzie 1,
- wywołanie
output(x: 2)
wywołuje instrukcję wewnątrz funkcjifunc output(x:Int)
i - wywołanie
output(x: "Swift")
wywołuje instrukcję wewnątrz funkcjifunc output(x:String)
.
Przykład 3: Przeciążanie funkcji na podstawie różnej liczby parametrów
func output() ( print("Good Morning!") ) func output(text:String) ( print(text) ) func output(text:String, num:Int) ( print("(text)(num)!") ) output() output(text: "Good Evening!") output(text1: "Good N", num: 8)
Po uruchomieniu powyższego programu wynik będzie:
Dzień dobry! Dobry wieczór! Dobranoc!
W powyższym programie funkcja output()
została przeciążona na podstawie liczby argumentów.
Pierwsza output()
nie przyjmuje parametrów, druga output()
przyjmuje pojedynczy parametr:, String
a trzecia output()
przyjmuje dwa parametry: String
i Int
.
Spróbujmy przeciążać, zmieniając nazwę parametru, ale zachowując etykietę argumentu taką samą jak:
Przykład 4: Przeciążanie funkcji z tą samą etykietą argumentu
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Po uruchomieniu powyższego programu wynik będzie:
2 Witam
Jak widać, w powyższym programie możesz użyć tej samej etykiety argumentu dla przeciążonych funkcji. Jednak, jak wymaga tego przeciążenie, musisz mieć różną liczbę parametrów lub różne typy parametrów.