Βοηθοί εγγραφών Delphi για σύνολα και άλλους απλούς τύπους

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

Στην έκδοση XE3 Delphi, οι βοηθοί εγγραφών έγιναν πιο ισχυροί επιτρέποντας να επεκταθούν απλοί τύποι Δελφών όπως χορδές, ακέραιοι, enums, σύνολα και παρόμοια.

Το σύστημα. Η μονάδα SysUtils, από την Delphi XE3, υλοποιεί ένα αρχείο που ονομάζεται "TStringHelper" το οποίο είναι στην πραγματικότητα ένας βοηθός εγγραφής για χορδές.

Χρησιμοποιώντας το Delphi XE3 μπορείτε να μεταγλωττίσετε και να χρησιμοποιήσετε τον επόμενο κώδικα:

var
s: συμβολοσειρά. ξεκινήσει
s: = 'Delphi ΧΕ3'. μικρό. Αντικαταστήστε ('XE3', 'κανόνες', []). ToUpper; τέλος; 

Για να είναι εφικτό αυτό, δημιουργήθηκε ένα νέο κατασκεύασμα στον "βοηθό καταγραφής" των Δελφών για τον [απλό τύπο] ". Για τις συμβολοσειρές, αυτό είναι "τύπος TStringHelper = βοήθημα εγγραφής για συμβολοσειρά". Το όνομα δηλώνει "βοηθό καταγραφής", αλλά αυτό δεν αφορά την επέκταση

instagram viewer
αρχεία - μάλλον για την επέκταση απλών τύπων όπως χορδές, ακέραιοι και παρόμοια.

Στο Σύστημα και στο Σύστημα. SysUtils υπάρχουν και άλλοι προκαθορισμένοι βοηθοί εγγραφών για απλούς τύπους, όπως: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (και μερικοί άλλοι). Μπορείτε να πάρετε από το όνομα ό, τι απλό τύπο επεκτείνει ο βοηθός.

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

Απαριθμήσεις; Βοηθός για απαριθμήσεις;

απαριθμήσεις
σκηνικά

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

Ακολουθεί μια απλή απαρίθμηση ("TDay") και ένας βοηθός εγγραφών:

τύπος
TDay = (Δευτέρα = 0, Τρίτη, Τετάρτη, Πέμπτη, Παρασκευή, Σάββατο, Κυριακή). TDayHelper = βοηθός εγγραφής για TDay. λειτουργία AsByte: byte; λειτουργία ToString: σειρά; τέλος; 
λειτουργία TDayHelper. AsByte: byte; ξεκινήσει
αποτέλεσμα: = Byte (εαυτό); τέλος; λειτουργία TDayHelper. ToString: σειρά; ξεκινήσειυπόθεση εαυτός του
Δευτέρα: αποτέλεσμα: = 'Δευτέρα'. Τρίτη: αποτέλεσμα: = 'Τρίτη'; Τετάρτη: αποτέλεσμα: = 'Τετάρτη'; Πέμπτη: αποτέλεσμα: = 'Πέμπτη'; Παρασκευή: αποτέλεσμα: = 'Παρασκευή'; Σάββατο: αποτέλεσμα: = 'Σάββατο'. Κυριακή: αποτέλεσμα: = 'Κυριακή'; τέλος; τέλος; 
var
aDay: TDay; s: συμβολοσειρά. ξεκινήσει
aDay: = TDay. Δευτέρα; s: = aDay. ToString. Να μειώσει; τέλος; 
μετατρέψτε ένα Delphi Enum σε μια παρουσίαση συμβολοσειράς

Σκηνικά? Βοηθός για σύνολα;

TDays = σύνολο απο TDay; 
var
ημέρες: TDays; s: συμβολοσειρά. ξεκινήσει
ημέρες: = [Δευτέρα.. Τετάρτη]; ημέρες: = ημέρες + [Κυριακή]; τέλος; 

ΑΛΛΑ, πόσο θα ήταν να είναι σε θέση να κάνει:

var
ημέρες: TDays; b: boolean; ξεκινήσειημέρες: = [Δευτέρα, Τρίτη] b: = ημέρες. Διασταυρώστε ([Δευτέρα, Πέμπτη]) IsEmpty;
τύπος
TDaysHelper = βοηθός εγγραφής για TDays. λειτουργία Διατέμνω(const ημέρες: TDays): TDays; λειτουργία IsEmpty: boolean; τέλος;... λειτουργία TDaysHelper. Διατέμνω(const ημέρες: TDays): TDays; ξεκινήσει
αποτέλεσμα: = εαυτός * ημέρες? τέλος; λειτουργία TDaysHelper. IsEmpty: boolean; ξεκινήσει
αποτέλεσμα: = self = []; τέλος; 

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

Αυτό σημαίνει ότι δεν μπορούν να συνταχθούν τα εξής:

// ΟΧΙ COMPILE OF ALIKE!
TGenericSet = σύνολο από ; 
Παραδείγματα απλών γενικών φαρμάκων TEnum

Εγγραφή βοηθός για σύνολο Byte!

τύπος
TByteSet = σύνολο απο Ψηφιόλεξη; TByteSetHelper = βοηθός εγγραφής για TByteSet. 

Μπορούμε να έχουμε τα εξής στον ορισμό του TByteSetHelper:

δημόσιοδιαδικασία Σαφή; διαδικασία Περιλαμβάνω(const τιμή: Byte); παραφορτώνω; στη γραμμή; διαδικασία Περιλαμβάνω(const τιμές: TByteSet); παραφορτώνω; στη γραμμή; διαδικασία Αποκλείω(const τιμή: Byte); παραφορτώνω; στη γραμμή; διαδικασία Αποκλείω(const τιμές: TByteSet); παραφορτώνω; στη γραμμή; λειτουργία Διατέμνω(const τιμές: TByteSet): TByteSet; στη γραμμή; λειτουργία IsEmpty: boolean; στη γραμμή; λειτουργία Περιλαμβάνει (const τιμή: Byte): boolean; παραφορτώνω; στη γραμμή;λειτουργία Περιλαμβάνει (const τιμές: TByteSet): boolean; παραφορτώνω; στη γραμμή;λειτουργία IsSuperSet (const τιμές: TByteSet): boolean; στη γραμμή; λειτουργία IsSubSet (const τιμές: TByteSet): boolean; στη γραμμή; λειτουργία Ισούται (const τιμές: TByteSet): boolean; στη γραμμή; λειτουργία ToString: σειρά; στη γραμμή; τέλος; 
{TByteSetHelper}διαδικασία TByteSetHelper. Συμπεριλάβετε (τιμή const: Byte); ξεκινήσει
Σύστημα. Συμπεριλάβετε (εαυτό, αξία); τέλος; διαδικασία TByteSetHelper. Εξαίρεση (τιμή const: Byte); ξεκινήσει
Σύστημα. Εξαίρεση (εαυτό, αξία); τέλος; διαδικασία TByteSetHelper. Σαφή; ξεκινήσει
αυτο: = []; τέλος; λειτουργία TByteSetHelper. Ίση τιμή (τιμές const: TByteSet): boolean; ξεκινήσει
αποτέλεσμα: = self = τιμές; τέλος; διαδικασία TByteSetHelper. Εξαίρεση (τιμές const: TByteSet); ξεκινήσει
αυτο: = αυτοεκτιμήσεις; τέλος; διαδικασία TByteSetHelper. Συμπεριλάβετε (τιμές const: TByteSet); ξεκινήσει
εαυτό: = εαυτό + τιμές? τέλος; λειτουργία TByteSetHelper. Περιλαμβάνει (τιμές const: TByteSet): boolean; ξεκινήσει
αποτέλεσμα: = IsSuperSet (τιμές); τέλος; λειτουργία TByteSetHelper. Διασταύρωση (τιμές const: TByteSet): TByteSet; ξεκινήσει
αποτέλεσμα: = τιμές * self * τέλος; λειτουργία TByteSetHelper. Περιλαμβάνει (τιμή const: Byte): boolean; ξεκινήσει
αποτέλεσμα: = αξία σε εαυτό? τέλος; λειτουργία TByteSetHelper. IsEmpty: boolean; ξεκινήσει
αποτέλεσμα: = self = []; τέλος; λειτουργία TByteSetHelper. IsSubSet (τιμές const: TByteSet): boolean; ξεκινήσει
αποτέλεσμα: = self <= τιμές; τέλος; λειτουργία TByteSetHelper. IsSuperSet (τιμές const: TByteSet): boolean; ξεκινήσει
αποτέλεσμα: = self> = τιμές. τέλος; λειτουργία TByteSetHelper. ToString: string; var
b: Byte; ξεκινήσειΓια σι σε εαυτός κάνω
αποτέλεσμα: = αποτέλεσμα + IntToStr (b) + ','; αποτέλεσμα: = Αντιγραφή (αποτέλεσμα, 1, -2 + Μήκος (αποτέλεσμα))? τέλος; 
var
ημέρεςAsByteSet: TByteSet; ξεκινήσει
ημέρεςAsByteSet. Σαφή; ημέρεςAsByteSet. Συμπεριλάβετε (Δευτέρα. AsByte); ημέρεςAsByteSet. Συμπεριλάβετε (Αύξων (Σάββατο); ημέρεςAsByteSet. Συμπεριλάβετε (Byte (TDay. Τρίτη)); ημέρεςAsByteSet. Συμπεριλάβετε (Ακέραιος (TDay. Τετάρτη)); ημέρεςAsByteSet. Συμπεριλάβετε (Ακέραιος (TDay. Τετάρτη)); // 2η φορά - χωρίς νόημα. ημέρεςAsByteSet. Εξαίρεση (TDay. Τρίτη. AsByte); Εμφάνιση μηνυμάτων (ημέρεςAsByteSet. ToString); Εμφάνιση μηνύματος (BoolToStr (ημέρεςAsByteSet. IsSuperSet ([Δευτέρα. AsByte, Σάββατο. AsByte]), αληθής)). τέλος; 

Υπάρχει ένα αλλά :(

Σημειώστε ότι το TByteSet δέχεται τιμές byte - και οποιαδήποτε τέτοια τιμή θα γίνει δεκτή εδώ. Το TByteSetHelper όπως υλοποιήθηκε παραπάνω δεν είναι αυστηρός τύπος απαρίθμησης (δηλ. Μπορείτε να το τροφοδοτείτε με τιμή μη TDay)... αλλά όσο γνωρίζω.. αυτό λειτουργεί για μένα.