Σε αυτό το άρθρο, θα μάθετε για την υπερφόρτωση λειτουργίας, πότε χρειαζόμαστε υπερφόρτωση λειτουργίας και πώς να υπερφορτώσετε με παραδείγματα.
Δύο ή περισσότερες συναρτήσεις με το ίδιο όνομα αλλά διαφορετικά επιχειρήματα είναι γνωστά ως υπερφορτωμένες συναρτήσεις.
Γιατί χρειαζόμαστε υπερφόρτωση λειτουργίας;
Φανταστείτε ότι αναπτύσσετε ένα παιχνίδι σκοπευτή όπου ο παίκτης μπορεί να επιτεθεί στους εχθρούς του χρησιμοποιώντας ένα μαχαίρι, μια λεπίδα και ένα όπλο. Η λύση σας για τη λειτουργία επίθεσης ενδέχεται να ορίζει τις ενέργειες σε λειτουργίες όπως:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Αλλά όταν προσπαθείτε να εκτελέσετε το παραπάνω πρόγραμμα, θα λάβετε ένα σφάλμα χρόνου μεταγλώττισης στο Swift ως «επίθεση ()» που είχε δηλωθεί προηγουμένως εδώ . Ωστόσο, μια άλλη λύση μπορεί να ορίζει διαφορετικά ονόματα λειτουργιών για τη συγκεκριμένη λειτουργικότητα όπως:
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") )
Μην ανησυχείτε αν δεν γνωρίζετε τι είναι η δομή. Προς το παρόν, σκεφτείτε το ως κάτι που δημιουργεί ένα φυσικό αντικείμενο στον προγραμματισμό, οπότε δημιουργείτε ένα μαχαίρι, ένα όπλο και μια λεπίδα. Αν θέλετε να μάθετε περισσότερα, ανατρέξτε στο Swift Struct. Εάν όχι, θα επανέλθουμε σε αυτά στα επόμενα κεφάλαια.
Το μόνο πρόβλημα με αυτήν τη λύση είναι ότι πρέπει να θυμάστε τα ονόματα των λειτουργιών για να καλέσετε τη συγκεκριμένη ενέργεια επίθεσης. Επίσης καθώς αυξάνεται το επίπεδο, ο παίκτης μπορεί να έχει πρόσθετα χαρακτηριστικά για επίθεση χρησιμοποιώντας βόμβα, χειροβομβίδα, κυνηγετικό όπλο κ.λπ.
Η δημιουργία συνάρτησης με διαφορετικά ονόματα είναι χρονοβόρα και αυξάνει γενικά τη μνήμη του ονόματος της συνάρτησης για να την καλέσετε. Συνολικά, δεν είναι διαισθητικό.
Θα ήταν πολύ καλύτερο αν μπορούσατε να δημιουργήσετε διαφορετικές λειτουργίες με το ίδιο όνομα αλλά διαφορετική εφαρμογή για κάθε όπλο. Με αυτόν τον τρόπο, η ανάμνηση ενός ονόματος λειτουργίας είναι αρκετή και δεν θα πρέπει να ανησυχείτε για τα ονόματα των λειτουργιών για άλλα όπλα.
Τι είναι η υπερφόρτωση λειτουργίας;
Η διαδικασία που μόλις περιγράψαμε είναι γνωστή ως υπερφόρτωση λειτουργίας. Εξ ορισμού, η διαδικασία δημιουργίας δύο ή περισσοτέρων από δύο συναρτήσεων με το ίδιο όνομα αλλά με διαφορετικό αριθμό ή τύπους παραμέτρων είναι γνωστή ως λειτουργία υπερφόρτωσης.
Ας το δούμε στο παρακάτω παράδειγμα:
Παράδειγμα 1: Υπερφόρτωση λειτουργίας
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())
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
Επίθεση με όπλο Επίθεση με λεπίδα Επίθεση με μαχαίρι
Στο παραπάνω πρόγραμμα, έχουμε δημιουργήσει τρεις διαφορετικές λειτουργίες με το ίδιο όνομα attack
. Ωστόσο, δέχεται διαφορετικούς τύπους παραμέτρων. Με αυτόν τον τρόπο η απομνημόνευση attack
ονόματος για κλήση της συνάρτησης είναι αρκετή.
- Η κλήση
attack(with: Gun())
ενεργοποιεί τη δήλωση μέσα στη συνάρτησηfunc attack(with weapon:Gun)
. - Η κλήση
attack(with: Blade())
ενεργοποιεί τη δήλωση μέσα στη συνάρτησηfunc attack(with weapon:Blade)
. - Η
attack(with: Knife())
δήλωση κλήσης μέσα στη συνάρτησηfunc attack(with weapon:Knife)
.
Παράδειγμα 2: Λειτουργία Υπερφόρτωση με βάση διαφορετικούς τύπους παραμέτρων
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")
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
Η τιμή int είναι 2 Η τιμή συμβολοσειράς είναι Swift
Στο παραπάνω πρόγραμμα, έχουμε δύο συναρτήσεις με το ίδιο όνομα output()
και τον ίδιο αριθμό παραμέτρων. Ωστόσο, η πρώτη output()
συνάρτηση παίρνει έναν ακέραιο ως παράμετρο και η δεύτερη output()
συνάρτηση παίρνει String
ως παράμετρο.
Παρόμοιο με το Παράδειγμα 1,
- η κλήση για
output(x: 2)
ενεργοποίηση της δήλωσης μέσα στη συνάρτησηfunc output(x:Int)
και - η κλήση για
output(x: "Swift")
ενεργοποίηση της δήλωσης μέσα στη συνάρτησηfunc output(x:String)
.
Παράδειγμα 3: Λειτουργία Υπερφόρτωση βάσει διαφορετικού αριθμού παραμέτρων
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)
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
Καλημέρα! Καλό απόγευμα! Καληνυχτα!
Στο παραπάνω πρόγραμμα, η συνάρτηση output()
έχει υπερφορτωθεί με βάση τον αριθμό των ορισμάτων.
Το πρώτο output()
δεν παίρνει καμία παράμετρο, το δεύτερο output()
παίρνει μια μόνο παράμετρο: String
και το τρίτο output()
παίρνει δύο παραμέτρους: String
και Int
.
Ας προσπαθήσουμε να υπερφορτώσουμε αλλάζοντας το όνομα της παραμέτρου αλλά διατηρώντας την ετικέτα ορίσματος όπως:
Παράδειγμα 4: Λειτουργία υπερφόρτωσης με την ίδια ετικέτα ορίσματος
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Όταν εκτελείτε το παραπάνω πρόγραμμα, η έξοδος θα είναι:
2 Γεια σας
Όπως μπορείτε να δείτε, στο παραπάνω πρόγραμμα, μπορείτε να χρησιμοποιήσετε την ίδια ετικέτα ορίσματος για τις υπερφορτωμένες συναρτήσεις. Ωστόσο, όπως απαιτεί η υπερφόρτωση, πρέπει να έχετε είτε διαφορετικό αριθμό παραμέτρων είτε διαφορετικούς τύπους παραμέτρων.