miércoles, 15 de enero de 2014

Una breve descripción de "Interfaces"

Debido a que son importantes para Delphi, vamos a darle un breve vistazo a las interfaces y su aplicación.

DESCRIPCIÓN

Para empezar, una interfaz es una definición de los métodos y propiedades públicas. Las interfaces sirven como una especie de plantilla para las clases, la definición de los métodos y propiedades que una clase que implementa la interfaz debe utilizar. En ese sentido, una interfaz define un contrato que una clase debe implementar, sin definir cómo debe implementarse ese contrato.

Una de las características cruciales de una interfaz es que proporciona para el polimorfismo sin depender de ancestros comunes de clase. En otras palabras, dos clases que implementan la misma interfaz son asignación compatible con el respeto a esa interfaz, independientemente de lo que las clases que descienden de. ¿Que ventajas aporta esto respecto a una clase abstracta? Pues en este caso la definición es más limpia, nada más.

Lo anterior es de "manual" y es lo que uno tiene que saber a la hora de trabajar con interfaces.

Definición de interfaz para un artículo:
type
   IArticulo = interface
     procedure IncrementarExistencias( rCantidad: Real );
     procedure DecrementarExistencias( rCantidad: Real );
     function Facturar: Integer;
   end;
Las interfaces nunca pueden ser instanciadas.
var
  Articulo: IArticulo;
begin
  Articulo := IArticulo.Create;
end;
Al compilar nos daría el error: Object or class typed required (se requiere una clase u objeto)

Para utilizar una interfaz necesitamos implementarla a través de una clase.
 
type
  TArticulo = class( TInterfacedObject, IArticulo )
    procedure IncrementarExistencias( rCantidad: Real );
    procedure DecrementarExistencias( rCantidad: Real );
    function Facturar: Integer;


UTILIZANDO EL POLIMORFISMO PARA LA CREACION DE CLASES

Las clases polimórficas son aquellas clases que teniendo una definición común se pueden utilizar para distintos tipos de objeto.
  
IVehiculo = interface
  procedure Matricular;
end;
Utilizando la misma interfaz vamos a definir una clase para cada tipo de vehículo:
type
  TCoche = class( TInterfacedObject, IVehiculo )
    procedure Matricular;
  end;

  TCamion = class( TInterfacedObject, IVehiculo )
    procedure Matricular;
  end;
Ahora instanciamos ambas clases utilizando la misma interfaz:
  
var
  Vehiculo: IVehiculo;
begin
  Vehiculo := TCoche.Create;
  Vehiculo.Matricular;
  Vehiculo := TCamion.Create;
  Vehiculo.Matricular;
end;
En este caso todas las clases que implementan la interfaz IVehiculo tienen un método común pero podría darse el caso de que tuvieran métodos distintos, lo cual significa que hay que utilizar la herencia múltiple.

UTILIZANDO HERENCIA MÚLTIPLE MEDIANTE INTERFACES

Supongamos que tenemos estas dos interfaces:
type
  IVehiculo = interface
    procedure Matricular;
  end;


  IRemolque = interface
    procedure Cargar;
  end;
El vehículo tiene el método Matricular y el remolque tiene el método Cargar. A mi me interesa que un coche utilice el método Matricular, pero sólo el camión tiene que poder Cargar. Entonces la implementación de las clases de haría así:
TCoche = class( TInterfacedObject, IVehiculo )
  procedure Matricular;
end;


TCamion = class( TInterfacedObject, IVehiculo, IRemolque )
  procedure Matricular;
  procedure Cargar;
end;
La clase TCoche sólo implementa la interfaz IVehiculo pero la clase TCamion hereda implementa simultáneamente las interfaces IVehiculo y IRemolque pudiendo utilizar sus métodos indistintamente.

REFERENCIAS


No hay comentarios:

Publicar un comentario

About Me

Nerd, Geek, estudiante, amante de la fotografía y la música, gamer y... programador.

Popular Posts

Marcos "NP" Lizarraga E.