An interface is a contract through which a class guarantees that it will implement certain methods, provide certain properties and indexers, and support certain events, all of which are specified in the interface definition.
You declare an interface much like you would a class, but using the keyword interface. You can apply access modifiers to the interface, as you would with a class.
In the interface definition, the method declarations cannot have access modifiers.
To implement an interface on a class, you use the colon operator, followed by the name of the interface, similar to the syntax for inheritance.
Classes can derive from zero or one class, and can implement any number of interfaces. If a class has a base class and one or more interface, the base class must be listed first (after the colon). Separate base classes and implementation names by commas.
When you define a class that implements an interface, you must then implement all the required members of that interface.
In situations where you don't know what type of object you have, just that the object implements a specific interface, you can create a reference to the interface, and assign the object to that reference, providing you with access to the implemented interface methods.
You can use the is operator to determine if an object derives from a base class or implements an interface. The is operator returns a Boolean value indicating whether or not the cast is valid, but it does not perform the cast.
The as operator attempts to cast a reference to a base type or an interface, and returns null if the cast is not valid.
You can extend an interface to add new methods or members. In the new interface definition, use the colon operator followed by the name of the name of the original interface. This is very similar to derivation in classes.
The extended interface subsumes the original interface, so any class that implements the extended interface must also implement the original interface as well.
A class that implements an interface may mark any of the interface methods as virtual. These methods may then be overridden by derived classes.
When a class implements two or more interfaces with methods that have the same name, you resolve the conflict by prefixing the method name with the name of the interface and the dot operator (for example, IStorable.Write( )).