Nja, säg att du har flera olika klasser som principiellt är så pass annorlunda att de inte kan ärva från samma superklass. Men de har fortfarande en eller flera funktioner som är samma.
Till exempel du kan ha en abstrakt klass som heter "fordon", med både "cykel" och "bil" som underklasser. Det blir ju rätt när man säger att en cykel är ett fordon. Men sen vill du stoppa in "människa" under "fordon". En människa är ju inte ett fordon.
Men både människan och diverse fordon kan ju röra på sig. Båda har funktionen accelereration.
Så i stället för att stoppa klassen "människa" som underklass till den abstrakta klassen "fordon" så kan du skapa interfacet "IAccelerate" med metoden "Accelerate()" och implementera det på både den abstrakta klassen "fordon" och den lösa klassen "människa".
Hänger du med hur jag menar?
abstrakt class fordon implements IAccelerate -> class bil & class cykel
class människa implements IAccelerate
Sen kan du klumpa ihop allihopa i en lista av typen IAccelerate, loopa över dem med en for each/for-loop och anropa metoden Accelerate() för samtliga.