Quizás un ejemplo de código ayudaría, voy a usar C #, pero debería poder seguirlo.
Supongamos que tenemos una interfaz llamada IPayable
public interface IPayable
{
public Pay(double amount);
}
Ahora, tenemos dos clases concretas que implementan esta interfaz:
public class BusinessAccount : IPayable
{
public void Pay(double amount)
{
//Logic
}
}
public class CustomerAccount : IPayable
{
public void Pay(double amount)
{
//Logic
}
}
Ahora, supongamos que tenemos una colección de varias cuentas, para ello utilizaremos una lista genérica del tipo IPayable
List<IPayable> accountsToPay = new List<IPayable>();
accountsToPay.add(new CustomerAccount());
accountsToPay.add(new BusinessAccount());
Ahora, queremos pagar $ 50.00 a todas esas cuentas:
foreach (IPayable account in accountsToPay)
{
account.Pay(50.00);
}
Así que ahora ves cómo las interfaces son increíblemente útiles.
Se usan solo en objetos instanciados. No en clases estáticas.
Si hubiera hecho que el pago fuera estático, al recorrer los IPayable en accountsToPay no habría forma de averiguar si debería llamar a pagar en BusinessAcount o CustomerAccount.