Разбиране на помощниците от клас Delphi (и запис)

click fraud protection

Една характеристика на езика на Delphi, добавена преди няколко години (обратно в в Delphi 2005), наречена „Class Helpers“ е създадена да ви позволи да добавите нова функционалност към съществуващ клас (или запис) чрез въвеждане на нови методи в класа (запис).

По-долу ще видите още няколко идеи за помощници в клас + научете кога да и кога да не използвате помощници в клас.

Класен помощник за...

С прости думи, помощник на клас е конструкция, която разширява клас чрез въвеждане на нови методи в хелперния клас. Класен помощник ви позволява да разширите съществуващия клас, без всъщност да го променяте или наследявате от него.

За да разширите класа TStrings на VCL, вие трябва да декларирате и внедрите помощник на клас като следното:

Тип
TStringsHelper = класен помощник за TStrings. общественфункция Съдържа(конст aString: string): boolean; край; 

Горният клас, наречен "TStringsHelper" е помощник на класа за типа TStrings. Обърнете внимание, че TStrings е дефиниран в Classes.pas, единица, която по подразбиране е налична в клаузата за използване за която и да е

instagram viewer
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]: = Стойност; край; 

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

instagram story viewer