The C# Station Tutorial
by Joe Mayo, 2/24/02, updated 3/12/03 and 2/22/08
Lesson 13: Interfaces
This lesson teaches C# Interfaces. Our objectives are as follows:
- Understand the Purpose of Interfaces.
- Define an Interface.
- Use an Interface.
- Implement Interface Inheritance.
An interface looks like a class, but has no implementation. The only thing
it contains are definitions of events, indexers, methods and/or
properties. The reason interfaces only provide definitions is because
they are inherited by classes and structs, which must provide an implementation
for each interface member defined.
So, what are interfaces good for if they don't implement functionality? They're
great for putting together plug-n-play like architectures where components can be
interchanged at will. Since all interchangeable components implement the same interface,
they can be used without any extra programming. The interface forces each
component to expose specific public members that will be used in a certain way.
Because interfaces must be implemented by derived classes and structs,
they define a contract. For instance, if class foo implements the IDisposable
interface, it is making a statement that it guarantees it has the Dispose()
method, which is the only member of the IDisposable interface. Any code that
wishes to use class foo may check to see if class foo implements IDisposable.
When the answer is true, then the code knows that it can call foo.Dispose().
Listing 13-1 shows how to define an interface:
Listing 13-1. Defining an Interface: MyInterface.cs
interface IMyInterface
{
void
MethodToImplement();
}
Listing 13-1 defines an interface named IMyInterface. A common
naming convention is to prefix all interface names with a capital "I". This
interface has a single method named MethodToImplement(). This could
have been any type of method declaration with different parameters and return types.
I just chose to declare this method with no parameters and a void return
type to make the example easy. Notice that this method does not have an implementation
(instructions between curly braces - {}), but instead ends with a semi-colon,
";". This is because the interface only specifies the signature of
methods that an inheriting class or struct must implement. Listing
13-2 shows how this interface could be used.
Listing 13-2. Using an Interface: InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{
static
void Main()
{
InterfaceImplementer iImp =
new InterfaceImplementer();
iImp.MethodToImplement();
}
public
void MethodToImplement()
{
Console.WriteLine("MethodToImplement()
called.");
}
}
Get Setup Instructions For How to Run
this Program
The InterfaceImplementer class in Listing 13.2 implements the IMyInterface
interface. Indicating that a class inherits an interface is
the same as inheriting a class. In this case, the following syntax is used:
class InterfaceImplementer : IMyInterface
Now that this class inherits the IMyInterface interface, it must implement
its members. It does this by implementing the MethodToImplement() method.
Notice that this method implementation has the exact same signature, parameters
and method name, as defined in the IMyInterface interface. Any difference
will cause a compiler error. Interfaces may also inherit other interfaces.
Listing 13-3 shows how inherited interfaces are implemented.
Listing 13-3. Interface Inheritance: InterfaceInheritance.cs
using System;
interface IParentInterface
{
void
ParentInterfaceMethod();
}
interface IMyInterface : IParentInterface
{
void
MethodToImplement();
}
class InterfaceImplementer : IMyInterface
{
static
void Main()
{
InterfaceImplementer iImp =
new InterfaceImplementer();
iImp.MethodToImplement();
iImp.ParentInterfaceMethod();
}
public
void MethodToImplement()
{
Console.WriteLine("MethodToImplement()
called.");
}
public
void ParentInterfaceMethod()
{
Console.WriteLine("ParentInterfaceMethod()
called.");
}
}
Get Setup Instructions For How to Run
this Program
The code in listing 13.3 contains two interfaces: IMyInterface and
the interface it inherits, IParentInterface. When one interface
inherits another, any implementing class or struct must implement
every interface member in the entire inheritance chain. Since the InterfaceImplementer
class in Listing 13-3 inherits from IMyInterface, it also inherits
IParentInterface. Therefore, the InterfaceImplementer class must implement
the MethodToImplement() method specified in the IMyInterface interface
and the ParentInterfaceMethod() method specified in the IParentInterface
interface.
Summary
You now understand what interfaces are. You can implement an
interface and use it in a class. Interfaces may also be inherited
by other interface. Any class or struct that inherits an interface
must also implement all members in the entire interface inheritance chain.
I invite you to return for Lesson 14: Introduction to Delegates
and Events.
Your feedback and constructive contributions are welcome. Please feel free
to contact me for feedback or comments you may have about this lesson.
Copyright © 2000-2008 C# Station, All Rights Reserved