Разбиране на помощниците от клас Delphi (и запис) въвежда функция на езика на Delphi, която ви позволява да разширите дефиницията на клас или тип запис, като добавите функции и процедури (методи) към съществуващи класове и записи без наследяване.
Във версията на XE3 Delphi помощниците за запис стават по-мощни, като позволяват разширяване на прости типове Delphi като низове, цели числа, enums, множества и подобни.
Системата. Единицата SysUtils от Delphi XE3 реализира запис, наречен "TStringHelper", който всъщност е рекорден помощник за струните.
С помощта на Delphi XE3 можете да компилирате и използвате следния код:
Var
s: низ; започвам
s: = 'Delphi XE3'; с. Замяна ('XE3', 'правила', []). край;
За да е възможно това, в Delphi е направена нова конструкция „запис на помощник за [прост тип]“. За низовете това е "тип TStringHelper = помощник на запис за низ". Името гласи „помощник за запис“, но не става въпрос за разширяване записи - по-скоро за разширяване на прости типове като низове, цели числа и подобни.
В Система и Система. 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. Да понижи; край;
Комплекти? Помощник за комплекти?
TDays = набор от TDay;
Var
дни: TDays; s: низ; започвам
дни: = [понеделник.. Сряда]; дни: = дни + [неделя]; край;
НО, колко ВЕЛИКО би могло да се направи:
Var
дни: TDays; б: булева; започвамдни: = [понеделник, вторник] b: = дни. Пресечете се ([понеделник, четвъртък]).
Тип
TDaysHelper = записва помощник за TDays. функция Пресичане (конст дни: TDays): TDays; функция IsEmpty: булева; край;... функция TDaysHelper. Пресичане (конст дни: TDays): TDays; започвам
резултат: = самостоятелно * дни; край; функция TDaysHelper. IsEmpty: булева; започвам
резултат: = себе = []; край;
За всеки тип набор, построен около изброяване, трябва да имате отделен помощник, тъй като, за съжаление, изброенията и множествата не вървят заедно родови и родови типове.
Това означава, че не може да се състави следното:
// НЯМА КОМПЛЕКТ НА АЛИКЕ!
TGenericSet = набор от ;
Запишете помощник за набор от байтове!
Тип
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)... но стига да съм наясно.. това работи за мен.