Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 90

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 84 85 86 87 88 89 < 90 > 91 92 93 94 95 96 .. 320 >> Следующая

II Интерфейс Enumerable определяет этот нетоц (и ничего больше): public !Enumerator GetEnumeratorO
{
/7 А дальше-то что?
\
1
Если посмотреть, что делает GetEnumeratorO, то выяснится, что он возвращает еще один интерфейс — lEnumerator. Этот интерфейс используется для обращения к членам внутреннего набора объектов. Он также находится в пространстве имен
System. Col ecti ens и определяет следующие три метода:
// GetEnumeratorO возвращает что-нибудь из нижеперечисленного
public interface lEnumerator
[
bcol MoveNextO; // Передвинуть внутренний указатель («yptop)
// на одну позицию
object Current {get;} // Получить текущий элемент набора (свойство только
// для чтения)
void Reset О; // Установить курсор в начало набора (на первый
// объект)
}
Учитывая, что I Enumerable.GetEnumeratort) возвращает интерфейс lEnumerator, класс Cars придется переделать следующим образом: // Уже теплее
public Class Cars: !Enumerable. lEnumerator {
// Реализация IEnurerable
public lEnumerator GetEnumeratorO
Создание пользовательского нумератора 211
{
return {!Enumerator)this:
}
Г
Последнее, что мы должны сделать, — наполнить реальным содержанием методы MoveNextO, Current и Reset. Таким образом, окончательный вариант класса Саг, поддерживающего IEnurnerabl є и I Enumerator, может выглядеть так:
// Набор объектов Саг с реализованным нумератором!
public class Cars: IEnumerator. IEnumerable
{
private car[] carArray:
// Переменная для текущей позиции элемента в массиве int pos = -1;
public Cars О
{ // Здесь мы создаем несколько объектов класса Саг и добавляем их в массив )
// Реализация методов интерфейса !Enumerator
public bool MoveNextO
{
if(pos< carArray.Length) {
POS++;
return true:
else
return false:
I
public void ResetO { pos - 0: }
public object Current {
get { return carArray[pos]; }
!
Il Реализация метода интерфейса !Enumerable
public IEnumerator GetEnumeratorO
{
return (lEnumerator)this;
}
1
Теперь осталось разобраться с тем, что мы получили, снабдив наш класс Cars поддержкой интерфейсов IEnumerator и IEnumerable.
Во-первых, теперь с нашим классом стало возможно работать при помощи синтаксиса foreach:
Il Ура!
foreach (Саг с in carLot)
t
Console.WriteLineC'Name: {O)", с.PetName); Console.WriteLineCMax speed: {0(". c.MaxSpeed):
212 Глава 4 • Интерфейсы и коллекции
Во-вторых, теперь в нашем распоряжении есть новые способы обращения к объектам класса Саг, находящимся внутри объекта класса • (что очень похоже на интерфейс ІЕштХХХХв СОМ):
// Обращаемся к объектам Саг через IEnumerator
IEnumerator itfEnum:
itfEnum = (IErumeratoricarLot:
//Устанавливаем курсор на начало
itfEnum.Reset!):
// Перемещаем курсор вперед на один шаг itfEnum.MoveNextO:
// Выбираем одну иашину и включаем в ней радио object curCar - ItfEnum,Current; ((Car)curCar).CrankTunes(true):
Код приложения ObjEnum можно найти в подкаталоге Chapter 4.
Создание клонируемых объектов (интерфейс ICIoneable)
В главе 2 рассказывалось о том, что в классе System.Object определен метод Мет-berwiseClone(). Этот метод используется для специального типа копирования объекта — когда реальное копирование не происходит, а вместо этого создается еще одна ссылка на область оперативной памяти, занимаемую данным объектом. Для такого типа копирования используется специальный термин — «поверхностное копирование» (shallow сору). Пользователи объектов не вызывают метод MemberwiseClone{) напрямую - он вызывается автоматически, когда к объектам ссылочного типа применяется оператор назначения (=), то есть одна ссылка начинает указывать на ту же область оперативной памяти, что и другая.
Предположим, что в нашем распоряжении имеется класс Point (точка):
// Наш класс - это просто точка с координатами на плоскости
public class Point
{
// Поля (открытые переменные) public int x. у;
// Конструкторы public point С) {}
public PomUint х, inty){this.x - х; this.у = у:} // Заменен Object.ToStrinqO
public override string ToStringO {return "X: " + X + " Y: " +y: }
}
Point — это класс, а следовательно, он отнсетгч к ссылочным типам (как мы помним из обсуждения ссылочных и структурных ічпов в главе 2). Если мы применим к нему оператор назначения (=), то есть метод -lemberwi seClone(J, настоящей копии объекта создано не будет — вместо этого появ '.тся еще одна ссылка на об-
Создание клонируемых объектов (интерфейс ICIoneable) 213
ласть, занимаемую объектом в оперативной памяти. Но очень часто бь;иг.ет нужно создавать настоящие, действительно отдельные копии объекта (deep сору - глубокое копирование). Для того чтобы можно было применять глубокое копирование к объектам нашего класса при помощи стандартных методов, наш класс должен реализовыватшнтерфейс ICIoneable.
ВинтерфейсеІСІопеаЬІепредусмотренодин-единственньійметод-CloneO. Реализация этого метода, конечно же, зависит от того, какие внутренние данные определены в вашем классе. Однако смысл работы этого метода для всех классов будет одним и тем же: будет создан новый объект, и всем переменным этого объекта-копии будут присвоены значения соответствующих переменных исходного объек -та. Давайте научим наш объект Po' nt клонироваться:
Предыдущая << 1 .. 84 85 86 87 88 89 < 90 > 91 92 93 94 95 96 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100