Es útil para implementar comportamiento común entre clases que no tienen nada en común.
Por ejemplo, si uno tiene un código que maneja ordenamientos. El algoritmo para ordenar hace siempre, lo mismo, compara los valores de las cosas y las ordena.
Si yo tengo dos clases, una TCliente y otra TProducto y las quiero ordenadas a las dos, podría usar el mismo código de ordenar. Pero claro, el valor que me permite ordenar clientes puede ser un String, y el de productos un código de producto.
Mi código de ordenamiento tiene que poder acceder al "valor de ordenamiento" de objetos de ambas clases.
¿Cómo lo hago? Bueno, puedo crear una interfaz que tenga un método GetValorOrd, de tipo integer.
Todas las clases que yo quiera ordenar van a implementar esta interfaz, y mi código para ordenar NO recibe objetos de ninguna clase, sino objetos con la interfaz IOrdenable. Por ejemplo:
procedure Ordenar(var Elementos: array of IOrdenable);
Recibe un arreglo de objetos que implementan la interfaz IOrdenable. De qué clases son, no me importa, siempre y cuando implementen la interfaz.
TCliente y TProducto se pueden ordenar con el mismo código, aunque no tengan nada que ver una con la otra y el método por el cual obtienen su "valor de ordenamiento" puede ser completamente distinto.
¿Se entiende algo? Si no, preguntá de nuevo. Saludos.