NGWS SDK Documentation  

This is preliminary documentation and subject to change.
To comment on this topic, please send us email at ngwssdk@microsoft.com. Thanks!

1.10 Interfaces

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
   }
}