Понимание помощников класса Delphi (и записи)

Функция языка Delphi была добавлена ​​несколько лет назад (еще в в Delphi 2005) под названием «Помощники классов» предназначен для добавления новых функциональных возможностей к существующему классу (или записи) путем введения новых методов в класс (запись).

Ниже вы увидите еще несколько идей для помощников класса + узнайте, когда и когда не следует использовать помощников класса.

Помощник класса для...

Проще говоря, вспомогательный класс - это конструкция, которая расширяет класс, вводя новые методы в вспомогательный класс. Помощник класса позволяет вам расширять существующий класс, фактически не изменяя его или не наследуя от него.

Чтобы расширить класс TStrings в VCL, вы должны объявить и реализовать вспомогательный класс, как показано ниже:

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

Вышеупомянутый класс, называемый "TStringsHelper", является помощником класса для типа TStrings. Обратите внимание, что TStrings определяется в Classes.pas, единица, которая по умолчанию доступна в предложении использования для любого

instagram viewer
Delphi блок формы, например.

Функция, которую мы добавляем к типу TStrings с помощью нашего помощника по классу, называется «Contains». Реализация может выглядеть так:

функция TStringsHelper. Содержит(Const aString: string): логическое значение; начать
результат: = -1 <> IndexOf (aString); конец; 

Я уверен, что вы много раз использовали это в своем коде - чтобы проверить, есть ли у некоторого потомка TStrings, такого как TStringList, некоторое строковое значение в его коллекции Items.

Обратите внимание, что, например, свойство Items объекта TComboBox или TListBox имеет тип TStrings.

После реализации TStringsHelper и списка в форме (с именем «ListBox1») вы теперь можете проверить, является ли некоторая строка частью свойства Items списка, используя:

если ListBox1.Items. Содержит («некоторая строка») тогда... 

Помощники класса Go и NoGo

Реализация помощников класса имеет некоторые положительные и некоторые (вы можете подумать) негативные последствия для вашего кодирования.

В общем, вам следует избегать расширения ваших собственных классов - как будто вам нужно добавить некоторые новые функции в ваши собственные пользовательские классы - добавьте новый материал непосредственно в реализацию класса - не используя класс помощник.

Таким образом, помощники классов больше предназначены для расширения класса, когда вы не можете (или не обязаны) полагаться на обычное наследование классов и реализации интерфейса.

Помощник класса не может объявлять данные экземпляра, такие как новые частные поля (или свойства, которые будут читать / записывать такие поля). Добавление новых полей класса разрешено.

Помощник класса может добавлять новые методы (функция, процедура).

До Delphi XE3 вы могли расширять только классы и записи - сложные типы. В выпуске Delphi XE 3 вы также можете расширять простые типы, такие как integer или string или TDateTime, и иметь такую ​​конструкцию:

вар
s: строка; начать
s: = 'Помощники Delphi XE3'; s: = s. Верхний регистр. Задний ход; конец; 

Я напишу о Delphi XE 3 помощник простого типа в ближайшее время.

Где мой помощник класса

Одним из ограничений использования помощников класса, которые могут помочь вам «выстрелить себе в ногу», является тот факт, что вы можете определять и связывать нескольких помощников с одним типом. Тем не менее, только ноль или один помощник применяется в любом конкретном месте в исходном коде. Будет применен помощник, определенный в ближайшей области. Область действия класса или записи определяется в обычном Delphi мода (например, справа налево в предложении модуля).

Это означает, что вы можете определить два помощника класса TStringsHelper в двух разных единицах, но только один будет применяться при фактическом использовании!

Если помощник класса не определен в модуле, где вы используете его представленные методы - что в большинстве случаев будет так, вы не знаете, какую реализацию помощника класса вы бы на самом деле использовали. Два помощника класса для TStrings, названные по-разному или находящиеся в разных единицах, могут иметь разную реализацию для метода «Contains» в приведенном выше примере.

Использовать или нет?

Да, но помните о возможных побочных эффектах.

Вот еще одно удобное расширение для вышеупомянутого помощника класса TStringsHelper


TStringsHelper = помощник класса для TStrings. частныйфункция GetTheObject (Const строка: строка): TObject; процедура SetTheObject (Const строка: строка; Const Значение: TObject); общественностисвойство ObjectFor [Const строка: строка]: TObject читать GetTheObject записывать SetTheObject; конец;... функция TStringsHelper. GetTheObject (Const строка: строка): TObject; вар
idx: целое число; начать
результат: = ноль; idx: = IndexOf (aString); если idx> -1 тогда результат: = объекты [idx]; конец; процедура TStringsHelper. SetTheObject (Const строка: строка; Const Значение: TObject); вар
idx: целое число; начать
idx: = IndexOf (aString); если idx> -1 тогда Объекты [idx]: = Значение; конец; 

Если вы были добавление объектов в список строк, вы можете догадаться, когда использовать вышеуказанное удобное вспомогательное свойство.

instagram story viewer