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 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( )
).