Помощници за запис на Delphi за комплекти и други прости типове

Разбиране на помощниците от клас Delphi (и запис) въвежда функция на езика на Delphi, която ви позволява да разширите дефиницията на клас или тип запис, като добавите функции и процедури (методи) към съществуващи класове и записи без наследяване.

Във версията на XE3 Delphi помощниците за запис стават по-мощни, като позволяват разширяване на прости типове Delphi като низове, цели числа, enums, множества и подобни.

Системата. Единицата SysUtils от Delphi XE3 реализира запис, наречен "TStringHelper", който всъщност е рекорден помощник за струните.

С помощта на Delphi XE3 можете да компилирате и използвате следния код:

Var
s: низ; започвам
s: = 'Delphi XE3'; с. Замяна ('XE3', 'правила', []). край; 

За да е възможно това, в Delphi е направена нова конструкция „запис на помощник за [прост тип]“. За низовете това е "тип TStringHelper = помощник на запис за низ". Името гласи „помощник за запис“, но не става въпрос за разширяване записи - по-скоро за разширяване на прости типове като низове, цели числа и подобни.

instagram viewer

В Система и Система. SysUtils има и други предварително определени помощници на записи за прости типове, включително: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (и няколко други). Можете да получите от името какъв прост тип помага помощникът.

Има и някои удобни помощници с отворен код, като TDateTimeHelper.

Изброявания? Помощник за изброяване?

изброявания
комплекти

Изброенията и наборите, които се третират като прости типове, също могат да бъдат разширени (в XE3 и по-нататък) с функционалност, която може да има тип запис: функции, процедури и подобни.

Ето просто изброяване ("TDay") и помощник на записа:

Тип
TDay = (понеделник = 0, вторник, сряда, четвъртък, петък, събота, неделя); TDayHelper = записва помощник за TDay. функция AsByte: байт; функция ToString: низ; край; 
функция TDayHelper. AsByte: байт; започвам
резултат: = Байт (самостоятелно); край; функция TDayHelper. ToString: низ; започвамслучай себе си на
Понеделник: резултат: = 'понеделник'; Вторник: резултат: = 'Вторник'; Сряда: резултат: = 'сряда'; Четвъртък: резултат: = 'четвъртък'; Петък: резултат: = 'петък'; Събота: резултат: = 'събота'; Неделя: резултат: = 'неделя'; край; край; 
Var
aDay: TDay; s: низ; започвам
aDay: = TDay. понеделник; s: = aДен. ToString. Да понижи; край; 
конвертирате Delphi Enum в струнно представителство

Комплекти? Помощник за комплекти?

TDays = набор от TDay; 
Var
дни: TDays; s: низ; започвам
дни: = [понеделник.. Сряда]; дни: = дни + [неделя]; край; 

НО, колко ВЕЛИКО би могло да се направи:

Var
дни: TDays; б: булева; започвамдни: = [понеделник, вторник] b: = дни. Пресечете се ([понеделник, четвъртък]).
Тип
TDaysHelper = записва помощник за TDays. функция Пресичане (конст дни: TDays): TDays; функция IsEmpty: булева; край;... функция TDaysHelper. Пресичане (конст дни: TDays): TDays; започвам
резултат: = самостоятелно * дни; край; функция TDaysHelper. IsEmpty: булева; започвам
резултат: = себе = []; край; 

За всеки тип набор, построен около изброяване, трябва да имате отделен помощник, тъй като, за съжаление, изброенията и множествата не вървят заедно родови и родови типове.

Това означава, че не може да се състави следното:

// НЯМА КОМПЛЕКТ НА АЛИКЕ!
TGenericSet = набор от ; 
TEnum Simple generics Enum пример

Запишете помощник за набор от байтове!

Тип
TByteSet = набор от Байт; TByteSetHelper = записва помощник за TByteSet. 

Можем да имаме следното в дефиницията на TByteSetHelper:

общественпроцедура Ясно; процедура Включване (конст стойност: байт); свръхтовар; в редица; процедура Включване (конст стойности: TByteSet); свръхтовар; в редица; процедура Изключване (конст стойност: байт); свръхтовар; в редица; процедура Изключване (конст стойности: TByteSet); свръхтовар; в редица; функция Пресичане (конст стойности: TByteSet): TByteSet; в редица; функция IsEmpty: булева; в редица; функция Включва(конст стойност: байт): булева; претоварване; в редица;функция Включва(конст стойности: TByteSet): булева; претоварване; в редица;функция IsSuperSet (конст стойности: TByteSet): булева; в редица; функция IsSubSet (конст стойности: TByteSet): булева; в редица; функция Се равнява(конст стойности: TByteSet): булева; в редица; функция ToString: низ; в редица; край; 
{TByteSetHelper}процедура TByteSetHelper. Включване (стойност на const: байт); започвам
Система. Включете (себе си, стойност); край; процедура TByteSetHelper. Изключете (стойност на const: байт); започвам
Система. Изключете (себе си, стойност); край; процедура TByteSetHelper. Ясно; започвам
Аз: = []; край; функция TByteSetHelper. Равни (стойности на const: TByteSet): булева; започвам
резултат: = self = стойности; край; процедура TByteSetHelper. Изключете (стойности на const: TByteSet); започвам
себе: = самоценности; край; процедура TByteSetHelper. Включете (стойности на const: TByteSet); започвам
Аз: = Аз + стойности; край; функция TByteSetHelper. Включва (стойности на const: TByteSet): boolean; започвам
резултат: = IsSuperSet (стойности); край; функция TByteSetHelper. Пресечете се (стойности на const: TByteSet): TByteSet; започвам
резултат: = self * стойности; край; функция TByteSetHelper. Включва (стойност на const: байт): boolean; започвам
резултат: = стойност в себе си; край; функция TByteSetHelper. IsEmpty: булева; започвам
резултат: = себе = []; край; функция TByteSetHelper. IsSubSet (стойности на const: TByteSet): булева; започвам
резултат: = себе <= стойности; край; функция TByteSetHelper. IsSuperSet (стойности на const: TByteSet): булева; започвам
резултат: = себе> = стойности; край; функция TByteSetHelper. ToString: низ; Var
б: Байт; започвамза б в себе си правя
резултат: = резултат + IntToStr (b) + ','; резултат: = Копиране (резултат, 1, -2 + Дължина (резултат)); край; 
Var
daysAsByteSet: TByteSet; започвам
daysAsByteSet. Ясно; daysAsByteSet. Включете (понеделник) AsByte); daysAsByteSet. Включване (цяло число (събота); daysAsByteSet. Включване (Байт (TDay) Вторник)); daysAsByteSet. Включване (цяло число (TDay) Сряда)); daysAsByteSet. Включване (цяло число (TDay) Сряда)); // 2-ри път - няма смисъл. daysAsByteSet. Изключете (TDay) Вторник. AsByte); ShowMessage (дниAsByteSet ToString); ShowMessage (BoolToStr (daysAsByteSet) IsSuperSet ([понеделник. AsByte, събота. AsByte]), вярно)); край; 

Има но :(

Обърнете внимание, че TByteSet приема байтови стойности - и всяка такава стойност ще бъде приета тук. TByteSetHelper, както е внедрен по-горе, не е строг тип изброяване (т.е. можете да го захранвате със стойност, която не е TDay)... но стига да съм наясно.. това работи за мен.

instagram story viewer