Entendendo os Auxiliares da Classe Delphi (e Registro)

Um recurso da linguagem Delphi adicionado alguns anos atrás (em em Delphi 2005) chamado "Class Helpers" foi desenvolvido para permitir que você adicione novas funcionalidades a uma classe existente (ou um registro), introduzindo novos métodos para a classe (registro).

Abaixo, você encontrará mais algumas idéias para os assistentes de classe + aprender quando e quando não usar assistentes de turma.

Auxiliar de classe para...

Em palavras simples, um auxiliar de classe é uma construção que estende uma classe introduzindo novos métodos na classe auxiliar. Um auxiliar de classe permite estender a classe existente sem realmente modificá-la ou herdá-la.

Para estender a classe TStrings da VCL, você declararia e implementaria um auxiliar de classe como o seguinte:

tipo
TStringsHelper = ajudante de classe para TStrings. públicofunção Contém (const aString: string): booleano; fim; 

A classe acima, chamada "TStringsHelper" é um auxiliar de classe para o tipo TStrings. Observe que TStrings é definido no Classes.pas, uma unidade que, por padrão, está disponível na cláusula uses para qualquer

instagram viewer
Delphi unidade do formulário, por exemplo.

A função que estamos adicionando ao tipo TStrings usando nosso auxiliar de classe é "Contém". A implementação pode se parecer com:

função TStringsHelper. Contém (const aString: string): booleano; início
resultado: = -1 <> IndexOf (aString); fim; 

Estou certo de que você já usou o código acima muitas vezes - para verificar se algum descendente de TStrings, como TStringList, tem algum valor de string na coleção Items.

Observe que, por exemplo, a propriedade Items de um TComboBox ou um TListBox é do tipo TStrings.

Com o TStringsHelper implementado e uma caixa de listagem em um formulário (chamado "ListBox1"), agora você pode verificar se alguma string faz parte da propriedade Items da caixa de listagem usando:

E se ListBox1.Items. Contém ('alguma string') então... 

Ajudantes de Classe Go e NoGo

A implementação dos auxiliares de classe tem alguns impactos positivos e alguns (você pode pensar em) negativos em sua codificação.

Em geral, você deve evitar estender suas próprias classes - como se fosse necessário adicionar algumas novas funcionalidades ao suas próprias classes personalizadas - adicione diretamente as novas coisas na implementação da classe - sem usar uma classe ajudante.

Os auxiliares de classe são, portanto, mais projetados para estender uma classe quando você não pode (ou não precisa) confiar na herança de classe normal e nas implementações de interface.

Um auxiliar de classe não pode declarar dados da instância, como novos campos particulares (ou propriedades que leram / gravam esses campos). A adição de novos campos de classe é permitida.

Um auxiliar de classe pode adicionar novos métodos (função, procedimento).

Antes do Delphi XE3, você só podia estender classes e registros - tipos complexos. No Delphi XE 3, você também pode estender tipos simples como número inteiro ou string ou TDateTime, e ter construções como:

var
s: string; início
s: = 'Auxiliares do Delphi XE3'; s: = s. UpperCase. Marcha ré; fim; 

Escreverei sobre o auxiliar de tipo simples do Delphi XE 3 em um futuro próximo.

Onde está meu assistente de classe

Uma limitação ao uso de ajudantes de classe que podem ajudá-lo a "dar um tiro no pé" é o fato de poder definir e associar vários ajudantes a um único tipo. No entanto, apenas zero ou um auxiliar se aplica a qualquer local específico no código-fonte. O auxiliar definido no escopo mais próximo será aplicado. O escopo do auxiliar de classe ou registro é determinado no Delphi moda (por exemplo, da direita para a esquerda na cláusula de uso da unidade).

O que isso significa é que você pode definir dois auxiliares da classe TStringsHelper em duas unidades diferentes, mas apenas um será aplicado quando realmente usado!

Se um auxiliar de classe não estiver definido na unidade em que você usa os métodos introduzidos - o que na maioria dos casos será assim, você não saberá qual implementação de auxiliar de classe você realmente usaria. Dois auxiliares de classe para TStrings, nomeados de maneira diferente ou residentes em unidades diferentes podem ter implementação diferente para o método "Contém" no exemplo acima.

Use ou não?

Sim, mas esteja ciente dos possíveis efeitos colaterais.

Aqui está outra extensão útil para o auxiliar de classe TStringsHelper mencionado acima


TStringsHelper = ajudante de classe para TStrings. privadofunção GetTheObject (const uma linha: corda): TObject; procedimento SetTheObject (const uma linha: corda; const Valor: TObject); públicopropriedade ObjectFor [const uma linha: corda]: TObject ler GetTheObject escrever SetTheObject; fim;... função TStringsHelper. GetTheObject (const uma linha: corda): TObject; var
idx: inteiro; início
resultado: = nulo; idx: = IndexOf (aString); E se idx> -1 então resultado: = objetos [idx]; fim; procedimento TStringsHelper. SetTheObject (const uma linha: corda; const Valor: TObject); var
idx: inteiro; início
idx: = IndexOf (aString); E se idx> -1 então Objetos [idx]: = Valor; fim; 

Se você esteve adicionando objetos a uma lista de cadeias, você pode adivinhar quando usar a propriedade auxiliar útil acima.

instagram story viewer