Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3. Индексаторы в интерфейсах

Индексаторы можно объявлять в интерфейсе (interface). Между методами доступа индексаторов интерфейса и методами доступа индексаторов класса существуют следующие отличия:

  • Методы доступа интерфейсов не используют модификаторы доступа.

  • Метод доступа интерфейса не имеет тела.

Поэтому метод доступа предназначен для того, чтобы указывать, доступен ли индексатор для чтения и записи, только для чтения или только для записи.

Ниже приведён пример метода доступа индексатора интерфейса:

public interface ISomeInterface

{

//...

// Индексатор

string this[int index]

{

get;

set;

}

}

Сигнатура индексатора должна отличаться от сигнатур всех других индексаторов, объявленных в том же интерфейсе.

В следующем примере показана реализация индексаторов интерфейса:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

// Интерфейс

public interface ISomeInterface

{

// Индексатор интерфейса

int this[int index]

{

get;

set;

}

}

// Реализация интерфейса

class IndexerClass : ISomeInterface

{

private int[] arr = new int[100];

public int this[int index] // Объявляем индексатор

{

get

{

// Объект arr выдаст исключение IndexOutOfRange

return arr[index];

}

set

{

arr[index] = value;

}

}

}

class Program

{

static void Main()

{

IndexerClass test = new IndexerClass();

Random rand = new Random();

// Вызываем индексатор для инициализации элементов класса test

for (int i = 0; i < 10; i++)

{

test[i] = rand.Next();

}

for (int i = 0; i < 10; i++)

{

Console.WriteLine("Элемент #{0} = {1}", i, test[i]);

}

Console.WriteLine("Для продолжения нажмите любую клавишу . . . ");

Console.ReadKey();

}

}

}

/* Выведет:

* Элемент #[От 0 до 9] = [Случайное число]

* Для продолжения нажмите любую клавишу . . .

*/

В предыдущем примере можно использовать явную реализацию члена интерфейса с помощью полного имени члена интерфейса. Однако, полное имя требуется для исключения неоднозначности только тогда, когда класс реализует более одного интерфейса с одинаковой сигнатурой индексатора. Например, если класс Employee реализует два интерфейса ICitizen и IEmployee с одинаковой сигнатурой индексатора, требуется явная реализация члена интерфейса.

4. Сравнение свойств и индексаторов

Индексаторы подобны свойствам. За исключением различий, перечисленных в следующей таблице, все правила, определенные для методов доступа к свойствам, применимы и к методам доступа к индексаторам:

Свойство

Индексатор

Позволяет вызывать методы как открытые элементы данных

Обеспечивает доступ к элементам внутренней коллекции объекта с помощью представления массива самого объекта

Доступ посредством простого имени

Доступ посредством индекса

Допускаются статические члены или члены экземпляров

Допускаются только члены экземпляров

Метод доступа get свойства не имеет параметров

Метод доступа get индексатора имеет такой же список формальных параметров, как и индексатор

Метод доступа set свойства содержит неявный параметр value

Метод доступа set индексатора имеет такой же список формальных параметров, как и индексатор, а также параметр value

Поддерживается сокращённый синтаксис и автоматически реализуемые свойства

Сокращенный синтаксис не поддерживается