| 1.1 ¿Por qué usar la interfaz? Por ejemplo: hay un servicio de venta de entradas, los cines pueden vender boletos, las casas de ópera pueden vender boletos y las estaciones de pasajeros también pueden vender boletos. ¿Servicios de venta de entradas? Debe saber que incluso los gerentes pueden vender boletos, lo que obviamente no es adecuado para incluir a los gerentes en la estructura de herencia de los servicios de venta de boletos. Por lo tanto, el servicio de venta de entradas es una interfaz. 1.2 Cómo usar interfaces en Delphi | | 1.2.1 Declarar interfaz imyInterface = interfaz (iiinterface) // instrucciones (1) ['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}'] // Función (2) Función GetName ( const Str: String): String ; ;función _release: entero ; Fin ; Explicación (1): Si hay una relación continua, complete la interfaz principal en los soportes, de lo contrario, guárdelo, como: IMYInterface = Interface. Nota (2): este GUID es opcional. tiempo de ejecución, como la definición del método de interfaz. Nota (3): la interfaz debe implementar estas tres funciones. 1.2.2 La interfaz de implementación de la interfaz Los servicios de interfaz se implementan mediante clases. Tintfclass = class (tobject, imyInterface) privatefcounter: integer; frefcount: integer; publicfunction QueryInterface (const iid: tguid; out obj): hresult; Por ejemplo: var aintf: iMyInterface; beginaobj: = tintfclass.create; tryAnTrf: = (imyInterface (AOBJ); ... b. Use el mecanismo incorporado del compilador Delphi. Por ejemplo: Aintf: = AOBJ.C. Use el método de consulta del objeto. La interfaz debe especificarse explícitamente desde iinterface la interfaz hereda. Delphi verificará la interfaz en sí mismo si el código de liberación no se libera después de su uso y se agrega el programa generado, pero esto también causa problemas, como el siguiente código: Var I: Integer; = TintfcLass.create ; NIL está configurado en la interfaz y Freeandnil (AOBJ) se liberará nuevamente, y el objeto se ha lanzado cuando Aintf es nulo. , solo necesita reducir el recuento de referencias sin liberar. Delegación de objeto de clase. Implementa la interfaz: TIMPLASS = Class (Tobject, iImplinterface) Private FreFCount: Integer; Public Function ConvertTousD (const intd: Integer): Double; Comience si getinterface (IID, obj) luego resultado: = 0 el más resultado: = e_nointerface; end; function timplass._release: integer; Ahora hay otra clase TINTFServiceClass para implementar la interfaz Iimplinterface, no es necesario redefinirla. Con un objeto de clase, Crear Operación; delegado con un objeto. End; la implementación es la siguiente: Constructor tintfserviceClass.create; .Create; end; destructor tintfserviceClass.destroy; El puntero de interfaz GOG se define en el desplazamiento VMT -72 en la interfaz y rttidelphi: vmtintftable = -72. Función relacionada: GetInterfacecount; GetInterFacetable; Estructura relacionada: tinterfaceEntry = paquete de registro: tguid; vtable: pointer; iOffset: integer; implgetter: integer; end; pinterfacetable = ^tinterfacetable; tinterfacetable = empacado registroentRycount: entero; entradas: array [0..99999] de tinterfaceEntry; end; Self es un puntero a un puntero VMT, entonces: self.getinterfacetable.EntryCount es equivalente a: aptr: = pPointer (integeer ((puntero (self))^) + vmtintftable)^; Instrucción En la Declaración, la información RTTI se puede agregar al programa compilado en Delphi, como: {$ M+} iinvokable = interface (iiInerface) {$ m-} La información RTTI de la interfaz está definida por la estructura de registro de TintfmetAdata: tintfmetadata = Registro: String; // Nombre de la interfaz Unitname: String; // El nombre de la unidad del programa declarado por la interfaz mda: tintfmethEntryArray; // La matriz dinámica que almacena información del método en la interfaz: tguid; // Información de la interfaz: ptypeinfo; // puntero que describe información de interfaz ancinfo: ptypeinfo; // puntero que describe la información principal numanc: integer; // El número de métodos heredados desde el extremo de la interfaz principal; , ccpascal, ccstdcall, ccsafeCall); Ptypeinfo; // Describa el puntero de información del método Back-Pass Type Selfoinfo: ptypeinfo; // Información puntero que describe el método en sí los parámetros: tintfparamentyArray; // matriz dinámica que describe la información de los parámetros Hasrtti: boolean; // tiene este método el boolean el booleano tiene el boolean el booleano tiene el boolean el booleano. Valor Fin de la información RTTI; Formato de soporte final del tipo de información; |
|