Μέθοδος υπερφόρτωσης και προεπιλεγμένων παραμέτρων στους Δελφούς

Λειτουργίες και διαδικασίες αποτελούν σημαντικό μέρος της γλώσσας των Δελφών. Ξεκινώντας από τους Δελφούς 4, ο Δελφός μας επιτρέπει να δουλεύουμε με λειτουργίες και διαδικασίες που υποστηρίζουν προεπιλεγμένες παραμέτρους (κάνοντας το παράμετροι προαιρετικά) και επιτρέπει δύο ή περισσότερες ρουτίνες να έχουν το ίδιο όνομα αλλά να λειτουργούν ως εντελώς διαφορετικές ρουτίνες.

Ας δούμε πώς η υπερφόρτωση και οι προεπιλεγμένες παράμετροι μπορούν να σας βοηθήσουν να κωδικοποιήσετε καλύτερα.

Υπερφόρτωση

Με απλά λόγια, η υπερφόρτωση δηλώνει περισσότερες από μία ρουτίνες με το ίδιο όνομα. Η υπερφόρτωση μας επιτρέπει να έχουμε πολλαπλές ρουτίνες που μοιράζονται το ίδιο όνομα, αλλά με διαφορετικό αριθμό παραμέτρων και τύπων.

Για παράδειγμα, ας εξετάσουμε τις ακόλουθες δύο λειτουργίες:

{Οι υπερφορτωμένες ρουτίνες πρέπει να δηλώνονται. με την οδηγία περί υπερφόρτωσης}λειτουργία SumAsStr (a, b: ακέραιος αριθμός): σειρά; παραφορτώνω; ξεκινήσει Αποτέλεσμα: = IntToStr (a + b); τέλος; λειτουργία SumAsStr (α, β: παρατεταμένη; Ψηφία: ακέραιος αριθμός): 
instagram viewer
σειρά; παραφορτώνω; ξεκινήσει Αποτέλεσμα: = FloatToStrF (a + b, ffFixed, 18, ψηφία); τέλος;

Αυτές οι δηλώσεις δημιουργούν δύο λειτουργίες, οι οποίες ονομάζονται SumAsStr, οι οποίες λαμβάνουν διαφορετικό αριθμό παραμέτρων και είναι δύο διαφορετικών τύπων. Όταν καλούμε μια υπερφορτωμένη ρουτίνα, ο μεταγλωττιστής πρέπει να είναι σε θέση να πει ποια ρουτίνα θέλουμε να καλέσουμε.

Για παράδειγμα, το SumAsStr (6, 3) καλεί την πρώτη συνάρτηση SumAsStr, επειδή τα επιχειρήματά της είναι ακέραια.

Σημείωση: Οι Δελφοί θα σας βοηθήσουν να επιλέξετε τη σωστή εφαρμογή με τη βοήθεια της ολοκλήρωσης κώδικα και της κατανόησης κώδικα.

Από την άλλη πλευρά, σκεφτείτε αν προσπαθούμε να καλέσουμε τη συνάρτηση SumAsStr ως εξής:

 SomeString: = SumAsStr (6.0,3.0) 

Θα λάβουμε ένα σφάλμα που διαβάζει: "δεν υπάρχει υπερφορτωμένη έκδοση του 'SumAsStr' που μπορεί να καλείται με αυτά τα επιχειρήματα."Αυτό σημαίνει ότι πρέπει επίσης να συμπεριλάβουμε την παράμετρο Ψηφία που χρησιμοποιείται για να καθορίσετε τον αριθμό των ψηφίων μετά την υποδιαστολή.

Σημείωση: Υπάρχει ένας μόνο κανόνας κατά την εγγραφή υπερφορτωμένων ρουτινών, και αυτό σημαίνει ότι μια υπερφορτωμένη ρουτίνα πρέπει να διαφέρει σε τουλάχιστον έναν τύπο παραμέτρου. Ο τύπος επιστροφής δεν μπορεί να χρησιμοποιηθεί για τη διάκριση μεταξύ δύο ρουτινών.

Δύο μονάδες - μία ρουτίνα

Ας πούμε ότι έχουμε μια ρουτίνα στη μονάδα Α, και η μονάδα Β χρησιμοποιεί τη μονάδα Α, αλλά δηλώνει μια ρουτίνα με το ίδιο όνομα. Η δήλωση στη μονάδα Β δεν χρειάζεται την οδηγία περί υπερφόρτωσης - πρέπει να χρησιμοποιήσουμε το όνομα της μονάδας Α για να πληρούν τις προϋποθέσεις για την κλήση στην έκδοση Α της ρουτίνας από τη μονάδα Β.

Σκεφτείτε κάτι τέτοιο:

μονάδα ΣΙ;... χρήσεις ΕΝΑ;... διαδικασία RoutineName; ξεκινήσει Αποτέλεσμα: = A.RutineName; τέλος; 

Μια εναλλακτική λύση στη χρήση υπερφορτωμένων ρουτινών είναι η χρήση προεπιλεγμένων παραμέτρων, οι οποίες συνήθως έχουν ως αποτέλεσμα λιγότερο κώδικα για εγγραφή και συντήρηση.

Προεπιλεγμένες / Προαιρετικές παράμετροι

Για να απλοποιήσουμε ορισμένες δηλώσεις, μπορούμε να δώσουμε μια προκαθορισμένη τιμή για την παράμετρο μιας συνάρτησης ή διαδικασίας και μπορούμε να καλέσουμε τη ρουτίνα με ή χωρίς την παράμετρο, καθιστώντας την προαιρετική. Για να δώσετε μια προκαθορισμένη τιμή, τερματίστε τη δήλωση παραμέτρων με το ίσο (=) σύμβολο που ακολουθείται από μια σταθερή έκφραση.

Για παράδειγμα, δεδομένης της δήλωσης

λειτουργία SumAsStr (α, β: παρατεταμένη; Ψηφία: ακέραιο = 2): σειρά; 

οι ακόλουθες κλήσεις λειτουργιών είναι ισοδύναμες.

 SumAsStr (6.0, 3.0) 
 SumAsStr (6.0, 3.0, 2) 

Σημείωση: Οι παράμετροι με τις προεπιλεγμένες τιμές πρέπει να εμφανίζονται στο τέλος της λίστας παραμέτρων και πρέπει να περάσουν από την τιμή ή ως const. Μια παράμετρος αναφοράς (var) δεν μπορεί να έχει μια προεπιλεγμένη τιμή.

Όταν καλούμε ρουτίνες με περισσότερες από μία προεπιλεγμένες παραμέτρους, δεν μπορούμε να παραλείψουμε παραμέτρους (όπως στο VB):

λειτουργία SkipDefParams (var Μια χορδή; B: ακέραιο = 5, C: boolean = ψευδές): boolean,... // αυτή η κλήση δημιουργεί ένα μήνυμα σφάλματος
CantBe: = SkipDefParams ('delphi', True); 

Υπερφόρτωση με προεπιλεγμένες παραμέτρους

Όταν χρησιμοποιείτε τόσο την υπερφόρτωση λειτουργιών ή διαδικασιών όσο και τις προεπιλεγμένες παραμέτρους, μην εισάγετε διφορούμενες δηλώσεις ρουτίνας.

Εξετάστε τις ακόλουθες δηλώσεις:

διαδικασία DOIt (Α: εκτεταμένη; Β: ακέραιος = 0). παραφορτώνω; διαδικασία DOIt (Α: εκτεταμένη); παραφορτώνω; 

Η κλήση σε διαδικασία DoIt όπως DoIt (5.0), δεν μεταγλωττίζεται. Λόγω της προεπιλεγμένης παραμέτρου στην πρώτη διαδικασία, αυτή η δήλωση μπορεί να καλέσει και τις δύο διαδικασίες, επειδή είναι αδύνατο να προσδιοριστεί ποια διαδικασία πρόκειται να καλείται.