An interface is simply a base class that has no data members and only defines public abstract
methods. For example, this would be an interface in C++:
class IFrobbable {
public:
virtual void Frob() = 0;
}
Therefore when MI is available as a language feature you can "implement" interfaces by simply deriving from them (again, C++):
class Widget : public IFrobbable, public IBrappable {
// ...
}
Multiple inheritance in the general case gives rise to many questions and problems that don't necessarily have a single answer, or even a good one for your particular definition of "good" (dreaded diamond, anyone?). Multiple interface implementation sidesteps most of these problems exactly because the concept of "inheriting" an interface is a very constrained special case of inheriting a full-blown class.
And this is where "forced us to add the concept of interfaces" comes in: you cannot do much OO design when constrained to single inheritance only, for example there are serious issues with not being able to reuse code when code reuse is in fact one of the most common arguments for OO. You have to do something more, and the next step is adding multiple inheritance but only for classes that satisfy the constraints of an interface.
So, I interpret Krzysztof's quote as saying
Multiple inheritance in the general case is a very thorny problem that
we could not tackle in a satisfactory manner given real-life
constraints on the development of .NET. However, interface inheritance
is both much
simpler to tackle and of supreme importance in OOP, so we did put that
in. But of course interfaces also come with their own set of problems,
mainly regarding how the BCL is structured.