An interface contains only the signatures of methods, properties, events or indexers. A class or struct that implements an interface must implement the members of the interface that are specified in its definition.
Abstract classes are closely related to interfaces. These are classes that cannot be instantiated, and are frequently either partially implemented, or not implemented at all. One key difference between abstract classes and interfaces is that a class may implement an unlimited number of interfaces, but may inherit from only one abstract (or any other kind of) class. A class that is derived from an abstract class may still implement interfaces. Abstract classes are useful when creating components because they allow you to specify an invariant level of functionality in some methods, but leave the implementation of other methods until a specific implementation of that class is needed. They also version well, because if additional functionality is needed in derived classes, it can be added to the base class without breaking the code.