Interfaces are used to define a contract; a class or struct that implements the interface must adhere to this contract. Interfaces can contain methods, properties, indexers, and events as members.
The example
interface IExample { string this[int index] { get; set; } event EventHandler E; void F(int value); string P { get; set; } } public delegate void EventHandler(object sender, Event e);
shows an interface that contains an indexer, an event E
, a method F
, and a property P
.
Interfaces may employ multiple inheritance. In the example below, the interface IComboBox
inherits from both ITextBox
and IListBox
.
interface IControl { void Paint(); } interface ITextBox: IControl { void SetText(string text); } interface IListBox: IControl { void SetItems(string[] items); } interface IComboBox: ITextBox, IListBox {}
Classes and structs can implement multiple interfaces. In the example below, the class EditBox
derives from the class Control
and implements both IControl
and IDataBound
.
interface IDataBound { void Bind(Binder b); } public class EditBox: Control, IControl, IDataBound { public void Paint(); public void Bind(Binder b) {...} }
In the example above, the Paint
method from the IControl
interface and the Bind
method from IDataBound
interface are implemented using public members on the EditBox
class. C# provides an alternative way of implementing these methods that allows the implementing class to avoid having these members be public. Interface members can be implemented by using a qualified name. For example, the EditBox
class could instead be implemented by providing IControl.Paint
and IDataBound.Bind
methods.
public class EditBox: IControl, IDataBound { void IControl.Paint(); void IDataBound.Bind(Binder b) {...} }
Interface members implemented in this way are called "explicit interface member implementations" because each method explicitly designates the interface method being implemented.
Explicit interface methods can only be called via the interface. For example, the EditBox
’s implementation of the Paint
method can be called only by casting to the IControl
interface.
class Test { static void Main() { EditBox editbox = new EditBox(); editbox.Paint(); // error: EditBox does not have a Paint method IControl control = editbox; control.Paint(); // calls EditBox’s implementation of Paint } }