Definición e implementación de interfaces en Delphi

En Delphi, "interfaz" tiene dos significados distintos. En OOP jerga, puede pensar en una interfaz como una clase sin implementación. En la sección de interfaz de definición de unidad de Delphi se utiliza para declarar cualquier sección pública de código que aparezca en una unidad. Este artículo explicará las interfaces desde una perspectiva OOP.

Si está dispuesto a crear una aplicación sólida como una roca de manera que su código sea mantenible, reutilizable y flexible, OOP La naturaleza de Delphi lo ayudará a conducir el primer 70% de su ruta. Definir interfaces e implementarlas ayudará con el 30% restante.

Clases abstractas

Puede pensar en una interfaz como una clase abstracta con toda la implementación eliminada y todo lo que no sea público eliminado. Una clase abstracta en Delphi es una clase que no se puede instanciar: no se puede crear un objeto a partir de una clase marcada como abstracta.

Echemos un vistazo a un ejemplo de declaración de interfaz:

tipo
IConfigChanged = interfaz['{0D57624C-CDDE-458B-A36C-436AE465B477}']
procedimiento ApplyConfigChange;
final;
instagram viewer

los IConfigChanged es una interfaz Una interfaz se define como una clase, la palabra clave "interfaz" se usa en lugar de "clase". El compilador utiliza el valor Guid que sigue a la palabra clave de interfaz para identificar de forma exclusiva la interfaz. Para generar un nuevo valor GUID, simplemente presione Ctrl + Shift + G en el IDE de Delphi. Cada interfaz que defina necesita un valor Guid único.

Una interfaz en OOP define una abstracción, una plantilla para una clase real que implementará la interfaz, que implementará los métodos definidos por la interfaz. Una interfaz en realidad no hace nada, solo tiene una firma para la interacción con otras clases o interfaces (implementadoras).

La implementación de los métodos (funciones, procedimientos y métodos Get / Set de propiedad) se realiza en la clase que implementa la interfaz. En la definición de interfaz, no hay secciones de ámbito (privado, público, publicado, etc.) todo es público. Un tipo de interfaz puede definir funciones, procedimientos (que eventualmente se convertirán en métodos de la clase que implementa la interfaz) y propiedades. Cuando una interfaz define una propiedad, debe definir los métodos get / set; las interfaces no pueden definir variables.

Al igual que con las clases, una interfaz puede heredar de otras interfaces.

tipo
IConfigChangedMore = interfaz(IConfigChanged)
procedimiento ApplyMoreChanges;
final;

Programación

La mayoría de los desarrolladores de Delphi cuando piensan en interfaces piensan en programación COM. Sin embargo, las interfaces son solo una característica OOP del lenguaje: no están vinculadas a COM específicamente. Las interfaces se pueden definir e implementar en una aplicación Delphi sin tocar COM en absoluto.

Implementación

Para implementar una interfaz, debe agregar el nombre de la interfaz a la instrucción de clase, como en:

tipo
TMainForm = clase(TForm, IConfigChanged)
público
procedimiento ApplyConfigChange;
final;

En el código anterior, un formulario de Delphi llamado "MainForm" implementa la interfaz IConfigChanged.

Advertencia: cuando una clase implementa una interfaz, debe implementar todos sus métodos y propiedades. Si falla / olvida implementar un método (por ejemplo: ApplyConfigChange), un error de tiempo de compilación "E2003 Identificador no declarado: 'ApplyConfigChange'" ocurrira.
Advertencia: si intenta especificar la interfaz sin el valor GUID que recibirá: "El tipo E2086 'IConfigChanged' aún no está completamente definido".

Ejemplo

Considere una aplicación MDI donde se pueden mostrar varios formularios al usuario al mismo tiempo. Cuando el usuario cambia la configuración de la aplicación, la mayoría de los formularios necesitan actualizar su pantalla: mostrar / ocultar algunos botones, actualizar títulos de etiquetas, etc. Necesitaría una forma sencilla de notificar a todos los formularios abiertos que se ha producido un cambio en la configuración de la aplicación. La herramienta ideal para el trabajo era una interfaz.

Cada formulario que deba actualizarse cuando los cambios de configuración implementen IConfigChanged. Dado que la pantalla de configuración se muestra modalmente, cuando se cierra, el siguiente código garantiza que todos los formularios de implementación IConfigChanged sean notificados y se llame a ApplyConfigChange:

procedimiento DoConfigChange ();
var
cnt: entero;
icc: IConfigChanged;
empezar
para cnt: = 0 a -1 + pantalla. FormCount hacer
empezar
Si Soportes (pantalla. Formularios [cnt], IConfigChanged, icc) luego
icc. ApplyConfigChange;
final;
final;

Los apoyos función (definido en Sysutils.pas) indica si un determinado objeto o interfaz admite una interfaz específica. El código itera a través de la pantalla. Colección de formularios (del objeto TScreen): todos los formularios que se muestran actualmente en la aplicación. Si un formulario Pantalla. Formularios [cnt] soporta la interfaz, Apoya devuelve la interfaz para el último parámetro de parámetro y devuelve verdadero.

Por lo tanto, si el formulario implementa IConfigChanged, la variable icc se puede usar para llamar a los métodos de la interfaz implementados por el formulario. Tenga en cuenta, por supuesto, que cada formulario puede tener su propia implementación diferente del procedimiento ApplyConfigChange.

Antepasados

Cualquier clase que defina en Delphi debe tener un antepasado. TObject es el antepasado definitivo de todos los objetos y componentes. La idea anterior se aplica también a las interfaces, IInterface es la clase base para todas las interfaces. IInterface define 3 métodos: QueryInterface, _AddRef y _Release.

Esto significa que nuestro IConfigChanged también tiene esos 3 métodos, pero no los hemos implementado. ¡Esto se debe a que TForm hereda de TComponent que ya implementa la interfaz II por usted! Cuando desee implementar una interfaz en una clase que herede de TObject, asegúrese de que su clase herede de TInterfacedObject. Dado que TInterfacedObject es un TObject que implementa IInterface. Por ejemplo:

TMyClass = clase(TInterfacedObject, IConfigChanged)
procedimiento ApplyConfigChange;
final;

En conclusión, IUnknown = IInterface. I Desconocido es para COM.

instagram story viewer