Not only COM.
it's the principle of all OOP and OOD.
in OO language,
interface inheritance is also called subtyping.
implementation inheritance is also called subclassing.
subtyping gives loose coupling, flexibility.
subclassing gives tight coupling, more static.
look at the following pseudocode:
interface IA{
void f();
}
interface IB:IA{
void g();
}
class A1:IA{
...
}
class A2:IA{
...
}
class A3:IA{
...
}
NOTE, if we use subclassing to reuse code from A1/A2/A3, then:
class B1:A1, IB{
void g(){...}
}
class B2:A2, IB{
void g(){...}
}
...
see? when you do subclassing, you have to specify which specific implementation class (A1 or A2 or A3?) to inherit.
While if we use interface inheritance:
class B:IB{
void f(){a.f();}
void g(){...}
private final A a;
}