Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

If (ob is PointS)

Console.WriteLine("Struct: X={0}; Y={1}",

((PointS)ob).X, ((PointS)ob).Y);

else

If (ob is Double)

Console.WriteLine("Double: Value={0}",

((double)ob).ToString());

}

}

struct PointS // структура

{

double x, y;

public double X { get { return x; } set { x = value; } }

public double Y { get { return y; } set { y = value; } }

}

Результат выполнения программы:

Double: Value=4,8

Double: Value=1,23

Struct: X=10,2; Y=0

В методе Main( ) после размещения в массиве-списке dinamo четырёх

элементов, эти элементы перебираются в цикле foreach. Параметр цикла ob имеет

тип object. Ему последовательно присваиваются ссылки на разнотипные элементы

массива-списка. Непосредственно использовать параметр типа object для доступа к

объектам разных типов невозможно – у каждого типа своя структура, свои члены,

свои поля. В теле цикла условные операторы, предназначенные для распознавания

типов. Распознаются только типы double и PointS. В качестве проверяемого

условия в операторах if используется выражение с операцией is

"операция is" .

Обратите внимание как с помощью выражения с индексацией выполнено

присваивание второму элементу массива-списка:

dinamo[1] = 1.23;

Перед этим присваиванием значением элемента dinamo[1] был объект

структуры PointS.

15.5. Реализация структурами интерфейсов

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

единообразно обрабатывать объекты разных типов, каждый из которых является

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

Такой возможности для экземпляров разнотипных структур нет, т.к.

структуры не наследуются. Однако структуры могут реализовывать интерфейсы

"интерфейс:реализация

интерфейса"

.

Если

несколько

структурных

типо

в

реализуют один и тот же интерфейс, то к объектам этих разных структур

применимы методы (а также свойства, индексаторы и события) интерфейса. Тем

самым

интерфейсы

позволяют

одинаково

обрабатывать

объекты

разных

структурных типов. Для этого ссылка на интерфейс используется в качестве

параметра, вместо которого могут подставляться аргументы структурных типов,

реализующих данный интерфейс. Второй пример – применение коллекций (частный

случай – массивов), элементы которых имеют разные структурные типы. Создание

такого массива возможно, если он объявлен с типом интерфейса, реализованного

всеми структурными типами.

В качестве примера определим интерфейс с прототипами свойств:

Interface iShape {

double Area {get; } // площадь

double Volume {get; } // объём

}

Реализовать такой интерфейс можно с помощью разных классов и структур.

Например, параллелепипед имеет площадь поверхности (Area) и объём (Volume). Те

же свойства имеются у любой трёхмерной геометрической фигуры. Реализовать тот

же интерфейс можно и в классе двумерных фигур. В этом случае объём будет равен

нулю.

Определим статический метод с заголовком:

static void information (IShape sh)

Его назначение – вывести данные об объекте, ссылка на который используется

в качестве аргумента. Тип параметра – это интерфейс, поэтому метод сможет

обрабатывать объекты любых типов, реализующих интерфейс IShape.

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

IShape. Первая из них Circle – представляет круги с заданными значениями

радиусов, вторая Sphere – сферы с заданными значениями радиуса. Метод

information() выводит сведения об аргументе. Текст программы:

// 15_12.cs - структуры и интерфейсы

using System

;

Соседние файлы в папке CSBasicCourse2ndedPodbelsky