Mi sono imbattuto in quest'esempio sulle interface, il quale spiega perchè le interfacce possono costituire un ottimo mezzo per estendere sistemi software

public interface PricedItem {
public void setPrice(double price);
public double getPrice();
}

-----------------------------------------------

public class Book implements PricedItem {
private String title;
private String author;
private double price;
...
public void setPrice(double price) {
this.price = price;
}

public double getPrice() {
return price;
}
}

----------------------------------------------------

double computeTotalPrice(Collection items) {
Iterator it = items.iterator();
PricedItem item;
double total = 0;

while (it.hasNext()) {
item = (PricedItem)it.next();
total += item.getPrice();
}
return total;
}
In questo modo, se volessi aggiungere dei "priced item" sui quali calcolare il prezzo, potrei creare una nuova classe che implementi l'intefìrfaccia PricedItems, senza cambiare nulla nella funzione computeTotalPrice, in questo modo:

public class CD implements PricedItem {
private String title;
private String singer;
private Collection songs;
private double price;
....

public void setPrice(double price) {
this.price = price;
}

public double getPrice() {
return price;
}
}
E allora, domanda, perchè servono le interfacce quando potrei ottenere la stessa funzionalità con l'ereditarietà?