Indexeurs dans les interfaces (Guide de programmation C#)

Les indexeurs peuvent être déclarés sur une interface (référence C#). Les accesseurs des indexeurs d'interface diffèrent des accesseurs des indexeurs de classe sur les points suivants :

  • Les accesseurs d'interface n'utilisent pas de modificateurs.

  • Un accesseur d'interface ne possède pas de corps.

Ainsi, l'accesseur a pour objet d'indiquer si l'indexeur est en lecture-écriture, en écriture seule ou en lecture seule.

Exemple d'accesseur d'indexeur d'interface :

public interface ISomeInterface
{
    //...

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

La signature d'un indexeur doit différer des signatures de tous les autres indexeurs déclarés dans la même interface.

Exemple

L'exemple suivant montre comment implémenter des indexeurs d'interface.

    // 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();
            System.Random rand = new System.Random();
            // Call the indexer to initialize its elements.
            for (int i = 0; i < 10; i++)
            {
                test[i] = rand.Next();
            }
            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();
        }
    }
    /* Sample output:
        Element #0 = 360877544
        Element #1 = 327058047
        Element #2 = 1913480832
        Element #3 = 1519039937
        Element #4 = 601472233
        Element #5 = 323352310
        Element #6 = 1422639981
        Element #7 = 1797892494
        Element #8 = 875761049
        Element #9 = 393083859
     */


Dans l'exemple précédent, vous pouvez utiliser l'implémentation explicite du membre d'interface à l'aide du nom qualifié complet du membre d'interface. Par exemple :

public string ISomeInterface.this 
{ 
} 

Toutefois, le nom qualifié complet est requis uniquement pour éviter toute ambiguïté lorsque la classe implémente plusieurs interfaces avec la même signature d'indexeur. Par exemple, si la classe Employee implémente deux interfaces, ICitizen et IEmployee, et que ces deux interfaces ont la même signature d'indexeur, l'implémentation explicite des membres d'interface est nécessaire. Ainsi, la déclaration d'indexeur suivante :

public string IEmployee.this 
{ 
} 

implémente l'indexeur sur l'interface IEmployee, tandis que la déclaration suivante :

public string ICitizen.this 
{ 
} 

implémente l'indexeur sur l'interface ICitizen.

Voir aussi

Référence

Indexeurs (Guide de programmation C#)

Propriétés (Guide de programmation C#)

Interfaces (Guide de programmation C#)

Concepts

Guide de programmation C#