Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы на вопросы_2003.doc
Скачиваний:
7
Добавлен:
16.04.2019
Размер:
275.46 Кб
Скачать

56. Семейства и индексаторы. Интерфейсы для работы с семействами.

Создайте класс семейства People (люди), который представляет

собой семейство класса Person. Доступ к элементам семейства

должен быть организован через строковый индексатор,

являющийся именем лица, которое идентично свойству Person,Name.

public class People

{private List<Person> people = new List<Person>();

public Person this[string name]

{ get

{ returnpeople.FirstOrDefault(person =>person.Name == name); } }}

Интерфейс для работы с семействами

Реализуйте в классе People интерфейс IСloneable,

который бы обеспечивал выполнение глубокого копирования.

public class People : ICloneable

{ public object Clone()

{ People clones = new People();

foreach (var person in this.people) {

var clone = new Person();

clone.Name = person.Name;

clone.Age = person.Age;

clones.people.Add(clone); }

returnclones; }}

Индексаторы

Ниже приведена общая форма одномерного индексатора:

тип_элемента this[intиндекс] {

//Аксессор для получения данных.

get{// Возврат значения, которое определяет индекс.

} //Аксессор для установки данных.

set: { // Установказначения, которое определяет индекс.

}}

где тип_элемента обозначает конкретный тип элемента индексатора. Следовательно, у каждого элемента, доступного с помощью индексатора, должен быть определенный тип элемента. Этот тип соответствует типу элемента массива. Параметр индекс по­лучает конкретный индекс элемента, к которому осуществляется доступ. Формально этот параметр совсем не обязательно должен иметь тип int:, но поскольку индексато­ры, как правило, применяются для индексирования массивов, то чаще всего использу­ется целочисленный тип данного параметра.

В теле индексатора определены два аксессора (т.е. средства доступа к данным): get и set. Аксессор подобен методу, за исключением того, что в нем не объявляется тип возвращаемого значения или параметры. Аксессоры вызываются автоматически при использовании индексатора, и оба получают -индекс в качестве параметра. Так, если индексатор указывается в левой части оператора присваивания, то вызывается аксессор set и устанавливается элемент, на который указывает параметр индекс. В противном случае вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Кроме того, аксессор set получает неявный параметр Vа1ие/ содержащий значение, присваиваемое по указанному индексу.

57.Делегаты. Операции с делегатами. Использование делегатов.

Делегат представляет собой объект, который может ссылаться на метод. Следовательно, когда создается делегат, то в итоге получается объект, содержащий ссылку на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод, на который он ссылается. Следует особо подчеркнуть, что один и тот же делегат может быть использован для вызова разных методов во время выполнения программы, для чего достаточно изменить метод, на который ссылается делегат. Таким образом, метод, вызываемый делегатом, определяется во время выполнения, а не в процессе компиляции. В этом, собственно, и заключается главное преимущество делегата.

Тип делегата объявляется с помощью ключевого слова delegate. Ниже приведенаобщая форма объявления делегата:

delegate возвращаемый_тип имя(список_параметров) ;

где возвращаемый_тип обозначает тип значения, возвращаемого методами, которые будут вызываться делегатом; имя — конкретное имя делегата; список_параметров — параметры, необходимые для методов, вызываемых делегатом. Как только будет создан экземпляр делегата, он может вызывать и ссылаться на те методы, возвращаемый тип и параметры которых соответствуют указанным в объявлении делегата.

Объект делегата обычно создается указанием имени метода, для которого делегат будет служить оболочкой, или с помощью анонимного метода. После создания экземпляра делегата вызов метода, выполненный в делегате, передается делегатом в этот метод. Параметры, передаваемые делегату вызывающим объектом, передаются в метод, а возвращаемое методом значение (при его наличии) возвращается делегатом в вызывающий объект. Эта процедура называется вызовом делегата. Делегат, для которого создан экземпляр, можно вызвать, как если бы это был метод, для которого создается оболочка.

Делегат следует использовать в следующих ситуациях:

  • Используется шаблон разработки событий.

  • Желательно инкапсулировать статический метод.

  • Вызывающему не требуется доступ к другим свойствам, методам или интерфейсам объекта для реализации метода.

  • Желательно простое построение.

  • Классу может потребоваться несколько реализаций метода.