Indizadores en interfaces (Guía de programación de C#)

Actualización: noviembre 2007

Las propiedades se pueden declarar en una interface (Referencia de C#). Los descriptores de acceso de los indizadores de interfaz se diferencian de los descriptores de acceso de los indizadores de clase en los siguientes aspectos:

  • Los descriptores de acceso de interfaz no utilizan modificadores.

  • Un identificador de acceso de interfaz no tiene cuerpo.

Así, el propósito del descriptor de acceso es indicar si el indizador es de lectura y escritura, de sólo lectura o de sólo escritura.

A continuación se muestra un ejemplo de descriptor de acceso de un indizador de interfaz:

public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}

La firma de un indizador debe ser diferente de las firmas de los demás indizadores declarados en la misma interfaz.

Ejemplo

En el ejemplo siguiente se muestra cómo se implementan indizadores de interfaz:

// Indexer on an interface:
public interface ISomeInterface
{
    // Indexer declaration:
    int this[int index]
    {
        get;
        set;
    }
}

// Implementing the interface.
class IndexerClass : ISomeInterface
{
    private int[] arr = new int[100];
    public int this[int index]   // indexer declaration
    {
        get
        {   
            // The arr object will throw IndexOutOfRange exception.
            return arr[index];
        }
        set
        {               
            arr[index] = value;                
        }
    }
}

class MainClass
{
    static void Main()
    {
        IndexerClass test = new IndexerClass();
        // Call the indexer to initialize the elements #2 and #5.
        test[2] = 4;
        test[5] = 32;
        for (int i = 0; i <= 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    Element #0 = 56.2
    Element #1 = 56.7
    Element #2 = 56.5
    Element #3 = 58.3
    Element #4 = 58.8
    Element #5 = 60.1
    Element #6 = 65.9
    Element #7 = 62.1
    Element #8 = 59.2
    Element #9 = 57.5
*/

En el ejemplo anterior, se podría usar la implementación de miembro de interfaz explícito mediante el nombre completo del miembro de interfaz. Por ejemplo:

public string ISomeInterface.this 
{ 
} 

Sin embargo, el nombre completo sólo es necesario para evitar la ambigüedad cuando la clase implementa más de una interfaz con la misma firma de indizador. Por ejemplo, si una clase Employee implementa dos interfaces, ICitizen y IEmployee, y ambas tienen la misma firma de indizador, será necesario implementar explícitamente el miembro de interfaz. Es decir, la siguiente declaración de indizador:

public string IEmployee.this 
{ 
} 

implementa el indizador en la interfaz IEmployee, mientras que la declaración:

public string ICitizen.this 
{ 
} 

implementa el indizador en la interfaz ICitizen.

Vea también

Tareas

Ejemplo de indizadores

Conceptos

Guía de programación de C#

Referencia

Indizadores (Guía de programación de C#)

Propiedades (Guía de programación de C#)

Interfaces (Guía de programación de C#)