Една характеристика на езика на Delphi, добавена преди няколко години (обратно в в Delphi 2005), наречена „Class Helpers“ е създадена да ви позволи да добавите нова функционалност към съществуващ клас (или запис) чрез въвеждане на нови методи в класа (запис).
По-долу ще видите още няколко идеи за помощници в клас + научете кога да и кога да не използвате помощници в клас.
Класен помощник за...
С прости думи, помощник на клас е конструкция, която разширява клас чрез въвеждане на нови методи в хелперния клас. Класен помощник ви позволява да разширите съществуващия клас, без всъщност да го променяте или наследявате от него.
За да разширите класа TStrings на VCL, вие трябва да декларирате и внедрите помощник на клас като следното:
Тип
TStringsHelper = класен помощник за TStrings. общественфункция Съдържа(конст aString: string): boolean; край;
Горният клас, наречен "TStringsHelper" е помощник на класа за типа TStrings. Обърнете внимание, че TStrings е дефиниран в Classes.pas, единица, която по подразбиране е налична в клаузата за използване за която и да е
Delphi единица на формата, например.Функцията, която добавяме към типа TStrings с помощта на нашия помощник на класа, е „Съдържа“. Изпълнението може да изглежда така:
функция TStringsHelper. Съдържа(конст aString: string): boolean; започвам
резултат: = -1 <> IndexOf (aString); край;
Сигурен съм, че сте използвали горното многократно в кода си - за да проверите дали някои TStrings потомък, като TStringList, има някаква стойност на низ в своята колекция от елементи.
Обърнете внимание, че например свойството Items на a TComboBox или TListBox е от типа TStrings.
След като TStringsHelper е изпълнен и полето за списък на формуляр (наречен "ListBox1"), сега можете да проверите дали някой низ е част от списъка Свойства на елементи, като използвате:
ако ListBox1.Items. Съдържа („някакъв низ“) тогава...
Class Helpers Go и NoGo
Внедряването на помощници на класове има някои положителни и някои (може да се сетите) отрицателни въздействия върху вашето кодиране.
Като цяло трябва да избягвате разширяването на собствените си класове - все едно трябва да добавите нова функционалност вашите собствени персонализирани класове - добавете новите неща в реализацията на класа директно - без да използвате клас помощник.
Следователно класовите помощници са по-проектирани да разширяват клас, когато не можете (или не е необходимо) да разчитате на нормалното наследяване на класове и реализациите на интерфейса.
Помощникът на клас не може да декларира данни за екземпляри, като нови частни полета (или свойства, които биха прочели / записали такива полета). Добавянето на нови полета от клас е позволено.
Помощникът от клас може да добави нови методи (функция, процедура).
Преди Delphi XE3 можете да разширявате само класове и записи - сложни типове. От версията на Delphi XE 3 можете също да разширите прости типове като цяло число или низ или TDateTime и да изградите като:
Var
s: низ; започвам
s: = 'Помощници на Delphi XE3'; s: = s. Главна буква. Обратен; край;
Ще пиша за Delphi XE 3 прост помощник тип в близко бъдеще.
Къде е моят класен помощник
Едно ограничение за използването на помощници от класа, което може да ви помогне да „стреляте в крака“ е фактът, че можете да определите и свържете множество помощници с един тип. Въпреки това, само нула или един помощник се прилага на всяко конкретно място в изходния код. Прилага се помощникът, определен в най-близкия обхват. Обхватът на помощника за клас или запис се определя в нормалното Delphi мода (например отдясно наляво в клаузата за използване на устройството).
Това означава, че можете да определите два помощника от клас TStringsHelper в две различни единици, но само един ще се прилага, когато реално се използва!
Ако помощният клас на клас не е дефиниран в устройството, където използвате въведените му методи - което в повечето случаи ще бъде така, не знаете каква реализация на помощник за клас всъщност бихте използвали. Два помощни класа за TStrings, наречени по различен начин или пребиваващи в различни единици, може да имат различна реализация за метода "Съдържа" в горния пример.
Използвайте или не?
Да, но бъдете наясно с възможните странични ефекти.
Ето още едно удобно разширение към споменатия по-горе помощник от клас TStringsHelper
TStringsHelper = класен помощник за TStrings. частенфункция GetTheObject (конст струна: низ): TObject; процедура SetTheObject (конст струна: низ; конст Стойност: TObject); общественИмот ObjectFor [конст струна: низ]: TObject Прочети GetTheObject пиши SetTheObject; край;... функция TStringsHelper. GetTheObject (конст струна: низ): TObject; Var
idx: цяло число; започвам
резултат: = нула; idx: = IndexOf (aString); ако idx> -1 тогава резултат: = Обекти [idx]; край; процедура TStringsHelper. SetTheObject (конст струна: низ; конст Стойност: TObject); Var
idx: цяло число; започвам
idx: = IndexOf (aString); ако idx> -1 тогава Обекти [idx]: = Стойност; край;
Ако сте били добавяне на обекти към списък с низове, можете да се досетите кога да използвате горната удобна помощна собственост.