| 1.1 Por que usar a interface? Por exemplo: existe um serviço de vendas de ingressos, os cinemas podem vender ingressos, as casas de ópera podem vender ingressos e estações de passageiros também podem vender ingressos. Serviços de vendas de ingressos? Você deve saber que até os gerentes podem vender ingressos, o que obviamente não é adequado para incluir gerentes na estrutura de herança dos serviços de vendas de ingressos. Portanto, o serviço de venda de ingressos é uma interface. Enquanto os cinemas, as casas de ópera e outros serviços seguem uma definição de serviço, eles podem interagir e se comunicar bem (se necessário). 1.2 Como usar interfaces em Delphi | | 1.2.1 Declare a interface iMyInterface = interface (iiInterface) // Instruções (1) ['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EAE}'] // Instruções (2) Função GetName ( const Str: String): String ; Função de Função ( constância ; Função _Rerenda: Inteiro ; final ; explicação (1): se houver um relacionamento contínuo, preencha a interface pai entre colchetes, caso contrário, salve -o, como: imyinterface = interface. Nota (2): Este GUID é opcional. Tempo de execução, como a definição do método da interface. Nota (3): a interface deve implementar essas três funções. 1.2.2 Os serviços de interface de implementação da interface são implementados por classes. TINTFCLASS = Classe (TOBJETO, IMYInterface) PrivateFCounter: Inteiro; Frefcount: Inteiro; Função Pública de Função Por exemplo: var aintf: iMyInterface; BeginaObj: = TINTFClass.Create; Tryaintf: = (iMyInterface (AOBJ); ... b. Use o mecanismo interno do compilador Delphi. Por exemplo: Aintf: = AOBJ.C. Use o método de consultoria do objeto. A interface deve ser explicitamente especificada da IInterface, os herds da interface. Delphi verificará a própria interface se o código de liberação não for liberado após o uso e o programa gerado for adicionado, mas isso também causa problemas, como o seguinte código: VAR I: Inteiro; = TINTFCLASS.CRATE ; O NIL é definido para a interface e o FreeAndnil (AOBJ) será lançado novamente, e o objeto foi liberado quando o AINTF estiver nil , você só precisa reduzir a contagem de referência sem liberar. Classe Delegação de Objeto implementa a interface: timplclass = classe (objeto, iimplinterface) privado Frefcount: Inteiro; função pública ConvertTousd (const Intd: Integer): duplo; Comece se getInterface (iid, obj), então resultado: = 0 Resultado: = e_nointerface; end; função timplclass._release: Integer; Agora, existe outra classe TintfServicClass para implementar a interface iimplinterface, não há necessidade de redefinir. com um objeto de classe, crie a sobrecarga; delegado com um objeto. END IMPLEMENTAÇÃO É A seguinte: Construtor TINTFSERVICECLASS.CRATE; .Create; final; destruidor tintfserviceclass.destroy; O ponteiro Gog da interface é definido no deslocamento VMT -72 na interface e rttidelphi: vmtintftable = -72. Função relacionada: getInterfacecount; GetInterfacetable; Estrutura relacionada: tinterfaceEntry = registro embalado: tguid; vtable: ponteiro; ioffset: integer; implictter: integer; end; pinterfacetable = ^tinterfacetable; tinterfacetable = packEdEntryCount: integer; entradas: matriz [0..999] do TEN. O próprio ponteiro de um ponteiro VMT, então: auto.getInterfacetable.EntryCount é equivalente a: aptr: = ppointer (número inteiro ((ponteiro (self)^) + vmtintftable)^; Instrução na declaração, as informações do RTTI podem ser adicionadas ao programa compilado em Delphi, como: {$ m+} iinvokable = interface (iiInterface) {$ m-} as informações rtti da interface são definidas pela estrutura de registros tintfmetadata: tintfmetadata = RecordName: String; Informações da interface: ptypeinfo; // ponteiro descrevendo informações da interface oncinfo: ptypeinfo; // ponteiro descrevendo informações dos pais no número inteiro; // O número de métodos herdados da interface dos pais; , ccpascal, ccstdcall, ccSafeCall); PtypeInfo; // descreve o ponteiro de informação do método do tipo de passagem traseira Selfinfo: ptypeinfo; // Ponteiro de informação descrevendo os próprios parâmetros do método: TINTFPARAMENTRYARRAY; // Matriz dinâmica descrevendo informações de parâmetros hasrtti: boolean; // esse método tem o bolean Valor final da informação RTTI; Stand Format End of Type Information; |
|