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

 

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

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

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

// Этот класс будет поддерживать IDraw. IDraw2 и IDraw3 public class Supeclmage : IDrav?
// Испсшує» явную реапиааито интерфейсов, чтобы повязать иеггда // к конкретным интерфейсам void !Draw. DrawO {
// Обычный вызс'/i на экран
I
void IDraw2.r)ra*ToPrinterO
{
// Вывод на принтер
void fDraw3.DrawToHetameC) г
}
// Вывод в метафайл
}
Применить этот класс на практике можно следующим образом:
// Проверяем наши интерфейсы public class TheApp
{
public static int Main(string[] args)
і
Superimage si = new Super linage O.
II Получаем ссыпку на интерфейс IDraw IDraw itfDraw = (IDraw)si; itf Draw. DrawO;
Il А теперь получаем ссылку на интерфейс IDraw3 ifCitfDraw is IDraw3)
{
IDraw3 itffJraw3 - CIDraw3)itfDraw;
208 Глава 4 • Интерфейсы и коллекции
itfDraw3.DrawToMetaFi1e(); itfDraw3.DrawToPrinterC):
return
}
Результат работы нашей программы представлен на рис. 4.6.
I O:\CSharpBook\Labs\Chapler4\IFdee... ИИ Ei
Bland drauing. . . Drawing to a neta file... Drauiiig to tlie yi-ititcr. - -Press any key to continue
LU.
J
Рис. 4.6. Используем иерархию интерфейсов в Superlmage
Наследование от нескольких базовых интерфейсов
С#, в отличие от классического СОМ, вполне допускает наследование сразу от нескольких базовых интерфейсов. При этом еще раз заметим, что множественное наследование между классами (когда один класс является производным одновременно от нескольких классов) в С# запрещено — множественное наследование разрешается только для интерфейсов. Проиллюстрируем возможности множественного наследования интерфейсов на примере.
Предположим, что в нашем распоряжении есть набор интерфейсов, моделирующих поведение автомобиля:
interface IBasicCar
I
DriveO:
interface runderwjterCar
{
void Dive!);
}
// А это - интерфейс, производный сразу от двух предыдущих: interface IJamesBondCar: IBasicCar. IUnderWaterCar
(
voidTurboBoostO:
Если мы захотим создать класс, который реализует интерфейс IJamesBondCar, нам придется реализовать в нем все методы каждого из интерфейсов. В нашей ситуации таких методов три: TurboBoo;::. О — разгоняться, Dive О — нырять и DriveO -ехать:
public class JSeaf ; IJamesBondCar
{
public JBCar-of}
//Унаследованные члены
void IBasicCar.DMveO{Console.writeLine("Speeding up...");)
Создание пользовательского нумератора 209
void IUnderwaterCar.DiveC){Console.WrіteLine ("Submerging..."):} vo.id IJ amesBondCar. TuboBoost () {Consol e. Wri teL і ne( "Blast off!"):}
I
Теперь наш универсальный автомобиль поддерживает все три способа передвижения:
JBCar j = new JBCarO: if(j is IJamesBondCar) {
((IJamesBondCar)j).DrIveC):
((I JamesBonriCar) j) .TurboBoost ():
((IJamesBondCar),]).DiveO:
}
Код приложения 1 face-Hierarchy можно найти в подкаталоге Chapter 4.
Создание пользовательского нумератора (интерфейсы IEnumerable и IEnumerator)
К этому моменту мы уже рассмотрели работу пользовательских интерфейсов и их иерархий. Настало время познакомиться с интерфейсами, которые уже встроены в библиотеку базовых классов .NET, и научиться приемам работы с ними. Стоит углубиться в библиотеку базовых классов .NET, как обнаружится, что множество стандартных классов-полуфабрикатов .NET реализуют одни и те же стандартные интерфейсы. Конечно, мы можем создавать и свои пользовательские типы, "с.;;-держивающие те же самые интерфейсы. То, как это делается, мы рассмотрим на примере интерфейсов IEnumerable и IEnumerator.
Для этого примера нам потребуется класс Cars, который представляет собой набор уже знакомых нам объектов класса Саг (определенных в главе 3). Вот исходное определение класса Cars:
\
// Cars - набор объектов класса Саг
public class Cars
{
private Car[] carArray;
Il При создании объекта класса Cars заполняем его несколькими объектами Саг
public CarsC)
{
carArray = new Car[4]; сагДггау[0] - new CarC'FeeFee". 200, 0); carArray[l] CarС"Clunker". 90. 0); сагАггауШ - new Car("Zippy". 30. 0); carArray[l] - new Car("Fred". 30, 0);
}
}
С точки зрения применения класса Cars в приложении было бы очень удобно обращаться ко всем внутренним объектам Саг этого класса при помощи конструкции foreach:
// Кажется очень public class CarDriver
I
210 Глава 4 • Интерфейсы и коллекции
public static void
{
Cars carLot = new Cars О;
Il Пробуен использовать foreach для обращения к каждому объекту Саг внутри // набора, представленного carLot "foreachfCar с in carLot){"
{
Console.WriteLineC'Name: {0}". c.PetName); Pnnso'e.wntS.-me'"fex speed: COV . c.tfaxSHeed):
J
}
1
Однако если вы попробуете запустить этот код на выполнение, компилятор начнет возмущаться тем, что класс Cars не реализует метод GetEnwator Этот метод определяется в интерфейсе I ?"[№¦. г tibi с, который находится в пространстве имен System.Collections. Чтобы справиться с возникшей проблемой, необходимо переопределить класс Cars таким образом, чтобы он поддерживал и этот интерфейс, и этот метод:
// Для применений конструкции foreach .іеобходиио. чтобы класс реалйзоаыЕел и !терфеЗс !Enumerable
public class Cars : ІЕпляегаЬіе {
Предыдущая << 1 .. 83 84 85 86 87 88 < 89 > 90 91 92 93 94 95 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100