Take this as example
interface IFlyable
{
void Fly();
}
class Bird : IFlyable
{
public void Fly() { }
}
class Plane : IFlyable
{
public void Fly() { }
}
List<IFlyable> things = GetBirdInstancesAndPlaneInstancesMixed();
foreach(IFlyable item in things)
{
item.Fly();
}
Although Bird and Plane share no common base class other than Object, we can deal with them as a group in our software by utilising the same interface because they have the same "feature": Fly