Interfaces.

Las interfaces definen el comportamiento de las clases que las implementan, por lo que cualquier tipo que implemente una interfaz, obligatoriamente implementa los miembros definidos de esa interfaz. La declaración es igual que la de una clase, pero haciendo uso de la palabra reservada 'interface'. Los nombres de las clases, por convenio (y es muy aconsejable), siempre comienzan por la letra 'I'. Los miembros de la interfaz no deben declarar los modificadores de acceso, pues por definición son públicos. Por ejemplo:

interfaz IReportChange
{
    bool HasChanged
    {
        get;
        set;
    }
    event EventHandler Changed;
}

El siguiente paso es la construcción de una clase que implemente la anterior interfaz:

public class MailServerSettings : IReportChange
{
    protected bool hasChanged;
    public bool HasChanged
    {
        get { return hasChanged; }
        set { hasChanged = value; }
    }
    public event EventHandler Changed;
}

El polimorfismo de la interfaz implica que cualquier objeto que implemente una interfaz se puede convertir en el tipo de esa interfaz y los miembros implementados se pueden llamar a partir de este objeto convertido. Por ello, si modificamos el descriptor de acceso 'set' de la propiedad 'HasChanged' de la clase 'MailServerSettings', entonces cualquier cambio en la variable 'hasChanged' provocará un evento 'Changed' y éste se ejecutará:

public bool HasChanged
{
    get { return hasChanged; }
    set
    {
        if (this.hasChanged != value)
        {
            this.hasChanged = value;
            if (this.Changed != null)
                this.Changed(this, new EventArgs());
        }
    }
}

Las interfaces también pueden heredar de otra interfaz, de tal manera que la interfaz derivada heredará todos los miembros de la interfaz base.

Ya sé que el estudio de las interfaces puede resultar complicado. De todas formas no te preocupes, porque las interfaces no las usarás hasta que consigas construir aplicaciones verdaderamente complicadas, y para entonces tu experiencia en C# será la suficiente para saber cuándo y a qué clases te vendrá bien implementar interfaces.