Κατανόηση βοηθών κλάσης (και εγγραφών) των Delphi

Ένα χαρακτηριστικό της γλώσσας των Δελφών προστέθηκε πριν από μερικά χρόνια (τρόπος πίσω στο στους Δελφούς του 2005) που ονομάζεται "Class Helpers" έχει σχεδιαστεί για να σας επιτρέψει να προσθέσετε νέες λειτουργίες σε μια υπάρχουσα κλάση (ή μια εγγραφή) εισάγοντας νέες μεθόδους στην κλάση (εγγραφή).

Παρακάτω θα δείτε κάποιες περισσότερες ιδέες για βοηθοί τάξεων + μάθετε πότε και πότε να μην χρησιμοποιείτε βοηθοί τάξης.

Βοηθός τάξης για...

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

Για να επεκτείνετε την κλάση TStrings της VCL, θα δηλώσετε και θα εφαρμόσετε έναν βοηθό κλάσης όπως είναι οι εξής:

τύπος
TStringsHelper = βοηθός τάξης για Τσιντς. δημόσιολειτουργία Περιέχει (const aString: συμβολοσειρά): boolean; τέλος; 

Η παραπάνω κλάση, που ονομάζεται "TStringsHelper", είναι βοηθός κλάσης για τον τύπο TStrings. Σημειώστε ότι το TStrings ορίζεται στο Classes.pas, μια μονάδα που είναι διαθέσιμη από προεπιλογή στη ρήτρα χρήσης για οποιαδήποτε

instagram viewer
Δελφοί για παράδειγμα.

Η λειτουργία που προσθέτουμε στον τύπο TStrings με τη βοήθεια του βοηθού κλάσης μας είναι "Περιέχει". Η εφαρμογή μπορεί να μοιάζει με:

λειτουργία TStringsHelper. Περιέχει (const aString: συμβολοσειρά): boolean; ξεκινήσει
αποτέλεσμα: = -1 <> IndexOf (aString); τέλος; 

Είμαι βέβαιος ότι έχετε χρησιμοποιήσει τα παραπάνω πολλές φορές στον κώδικα σας - για να ελέγξετε αν κάποια από τα TStrings απόγονοι, όπως το TStringList, έχουν κάποια τιμή συμβολοσειράς στη συλλογή στοιχείων της.

Σημειώστε ότι, για παράδειγμα, η ιδιότητα Items ενός a TComboBox ή ένα TListBox είναι τύπου TStrings.

Έχοντας εφαρμόσει το TStringsHelper και ένα πλαίσιο λίστας σε μια φόρμα (που ονομάζεται "ΛίσταBox1"), μπορείτε τώρα να ελέγξετε αν κάποια συμβολοσειρά είναι μέρος της ιδιότητας των στοιχείων της ιδιότητας στοιχείων χρησιμοποιώντας:

αν ListBox1.Items. Περιέχει ('κάποια συμβολοσειρά') έπειτα... 

Βοηθοί κατηγορίας Go και NoGo

Η εφαρμογή των βοηθών της τάξης έχει κάποια θετική και κάποια (μπορεί να σκεφτείτε) αρνητικές επιπτώσεις στην κωδικοποίησή σας.

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

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

Ο βοηθός κλάσης δεν μπορεί να δηλώσει δεδομένα στιγμιότυπων, όπως νέα ιδιωτικά πεδία (ή ιδιότητες που θα διαβάζουν / γράφουν τέτοια πεδία). Προστίθεται νέα πεδία κλάσης.

Ένας βοηθός τάξης μπορεί να προσθέσει νέες μεθόδους (λειτουργία, διαδικασία).

Πριν από τον Delphi XE3 θα μπορούσατε να επεκτείνετε μόνο κατηγορίες και αρχεία - σύνθετους τύπους. Από την έκδοση Delphi XE 3 μπορείτε επίσης να επεκτείνετε απλούς τύπους όπως ακέραιο ή συμβολοσειρά ή TDateTime, και να κατασκευάσετε όπως:

var
s: συμβολοσειρά. ξεκινήσει
s: = 'Βοηθοί Delphi XE3'. s: = s. UpperCase. ΑΝΤΙΣΤΡΟΦΗ; τέλος; 

Θα γράψω για τον βοηθό απλού τύπου Delphi XE 3 στο εγγύς μέλλον.

Πού είναι ο βοηθός της τάξης μου

Ένας περιορισμός στη χρήση βοηθών τάξης που μπορεί να σας βοηθήσει να «πυροβολήσετε τον εαυτό σας στο πόδι» είναι το γεγονός ότι μπορείτε να ορίσετε και να συσχετίσετε πολλαπλούς βοηθούς με έναν μόνο τύπο. Ωστόσο, μόνο μηδέν ή ένας βοηθός ισχύει σε οποιαδήποτε συγκεκριμένη τοποθεσία στον πηγαίο κώδικα. Ο βοηθός που ορίζεται στο πλησιέστερο πεδίο εφαρμογής θα ισχύει. Το πεδίο βοηθού κλάσης ή εγγραφής καθορίζεται στο κανονικό Δελφοί (για παράδειγμα, δεξιά προς τα αριστερά στη ρήτρα χρήσης της μονάδας).

Αυτό σημαίνει ότι μπορείτε να ορίσετε δύο βοηθοί τάξης TStringsHelper σε δύο διαφορετικές μονάδες, αλλά μόνο μία θα ισχύει όταν χρησιμοποιούνται πραγματικά!

Αν ένας βοηθός κλάσης δεν ορίζεται στη μονάδα όπου χρησιμοποιείτε τις μεθόδους που έχει εισαγάγει - κάτι που στις περισσότερες περιπτώσεις θα είναι έτσι, δεν ξέρετε ποια εφαρμογή βοηθού στην τάξη θα χρησιμοποιούσατε στην πραγματικότητα. Δύο βοηθοί τάξης για το TStrings, που ονομάζονται διαφορετικά ή διαμένουν σε διαφορετικές μονάδες, ενδέχεται να έχουν διαφορετική εφαρμογή για τη μέθοδο "Περιέχει" στο παραπάνω παράδειγμα.

Χρήση ή όχι;

Ναι, αλλά να γνωρίζετε τις πιθανές παρενέργειες.

Ακολουθεί μια άλλη εύχρηστη επέκταση στον προαναφερόμενο βοηθό κλάσης TStringsHelper


TStringsHelper = βοηθός τάξης για Τσιντς. ιδιωτικόςλειτουργία GetTheObject (const μια χορδή: σειρά): TObject; διαδικασία SetTheObject (const μια χορδή: σειρά; const Τιμή: TObject); δημόσιοιδιοκτησία ObjectFor [const μια χορδή: σειρά]: TObject ανάγνωση GetTheObject γράφω SetTheObject; τέλος;... λειτουργία TStringsHelper. GetTheObject (const μια χορδή: σειρά): TObject; var
idx: ακέραιο; ξεκινήσει
αποτέλεσμα: = μηδέν. idx: = indexOf (aString); αν idx> -1 έπειτα αποτέλεσμα: = Αντικείμενα [idx]; τέλος; διαδικασία TStringsHelper. SetTheObject (const μια χορδή: σειρά; const Τιμή: TObject); var
idx: ακέραιο; ξεκινήσει
idx: = indexOf (aString); αν idx> -1 έπειτα Αντικείμενα [idx]: = Αξία. τέλος; 

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