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

Interface iShape

{

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

double Area { get; } // поверхность

}

struct Circle : IShape // Круг

{

public double radius;

public Circle(double radius) // конструктор

{ this.radius = radius; }

public double Area { get { return Math.PI * radius * radius; } }

public double Volume { get { return 0; } } // объем

}

struct Sphere : IShape // Сфера

{

public double radius;

public Sphere(double radius) // конструктор

{ this.radius = radius; }

public double Area // поверхность

{ get { return 4 * Math.PI * radius * radius; } }

public double Volume // объем

{ get { return 4 * Math.PI * radius * radius * radius / 3; } }

}

class Program

{

static void information(IShape sh)

{

Console.Write(sh.GetType());

Console.WriteLine(":\t Area={0,5:f2};\t "

+"Volume={1,5:f2}", sh.Area, sh.Volume);

}

static void Main()

{

Circle ci = new Circle(25);

Information(ci);

Sphere sp = new Sphere(4);

Information(sp);

}

}

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

Circle: Area=1963,50; Volume= 0,00

Sphere: Area=201,06; Volume=268,08

В методе Main() созданы объекты структур Circle и Sphere, которые в

качестве аргументов передаются методу information(). Обратите внимание на

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

имел тип object, то необходимо было бы выполнять преобразование к типу

конкретного аргумента.

Как и классы структура может реализовать одновременно несколько

интерфейсов. Покажем на примере, как можно использовать эту возможность.

Сначала объявим интерфейс такого вида:

Interface iImage {

Void display();

double Measure {get;}

double BaseSize {set;}

}

Члены этого интерфейса могут быть реализованы по-разному, то есть им

можно придать самый разный смысл. Пусть свойство Measure – это максимальный

линейный размер («размах») геометрической фигуры; свойство BaseSize – базовый

линейный размер; display() – прототип метода, который выводит сведения о типе,

реализовавшем интерфейс, и значения свойств Measure, BaseSize конкретного

объекта. Такими типами в нашем примере будут структуры Cube и Square,

представляющие, соответственно, объекты «куб» и «квадрат». Для куба базовый

размер – ребро куба, максимальный размер – наибольшая диагональ. Для квадрата

базовый размер – сторона квадрата, максимальный размер – его диагональ.

Предположим, что объекты этих структур мы хотим разместить в массиве и

упорядочить элементы массива по убыванию значений свойства Measure. Для

сортировки элементов массива можно применить метод Array.Sort()

"метод:

Array.Sort()" . Этот метод предполагает, что элементы массива сравниваются друг с

другом с помощью метода CompareTo() "метод: CompareTo()" . Прототип этого

метода размещён в интерфейсе IComparable

"интерфейс: IComparable"

из

пространства имён System. Метод CompareTo() уже определён для таких типов как

int, char, string и т.д.. Однако для пользовательских типов, которыми будут

структуры Cube и Square, этот метод нужно определять явно. Поэтому реализуем

в

указанных структурах интерфейс IComparable. Тем самым в каждой из этих

структур с необходимостью появится такой нестатический метод:

public int CompareTo (object obj)

{

if (Measure <((IImage)obj).Measure) return +1;

if (Measure ==((IImage)obj).Measure) return 0;

else return -1;

}

Обратите внимание, что тип object параметра obj приводится к типу

интерфейса IImage, который должны иметь элементы массива.

Напомним, что в коде метода Array.Sort() выполняются многократные

обращения к методу CompareTo(), где сравниваются характеристики двух элементов

сортируемого массива. Если характеристика (в нашем примере свойство Measure)

вызывающего

элемента-объекта

находится

в

«правильном»

отношении

к

характеристике объекта-параметра, то метод CompareTo()

должен возвращать

отрицательное значение. При нарушении «порядка» элементов возвращается

положительное значение. Для элементов, одинаковых по характеристике сравнения,

возвращается значение 0.

Программа с указанными структурами может быть такой:

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

using System;

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