Заказать курсовые, контрольные, рефераты...
Образовательные работы на заказ. Недорого!

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

РефератПомощь в написанииУзнать стоимостьмоей работы

Предположим, что экземпляры этих структур мы хотим разместить в массиве и упорядочить элементы массива по убыванию значений свойства Measure. Для сортировки элементов массива можно применить метод Array. Sort (). Этот метод предполагает, что элементы массива сравниваются друг с другом с помощью метода CompareTo (). Прототип этого метода размещен в интерфейсе IComparable из пространства имен… Читать ещё >

Реализация структурами интерфейсов (реферат, курсовая, диплом, контрольная)

Применение одного базового класса с виртуальными членами позволяет единообразно (но, возможно, по-разному) обрабатывать объекты разных типов, каждый из которых является производным от базового и переопределяет его виртуальные члены.

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

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

interface IShape.

{

double Volume {get;} // объел? double Area {get;} // площадь

}

Реализовать такой интерфейс можно с помощью разных классов и структур. Например, параллелепипед имеет площадь поверхности (Area) и объем (Volume). Те же свойства имеются у любой трехмерной геометрической фигуры. Реализовать тот же интерфейс можно и в классе или структуре двумерных фигур. В этом случае объем будет равен, например, нулю.

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

static void information (IShape sh).

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

В следующей программе определены два структурных типа, реализующих интерфейс IShape. Первый из них Circle — представляет круги с заданными значениями радиусов, второй Sphere — сферы с заданными значениями радиуса. Метод information () выводит сведения об аргументе. Текст программы:

// 1512.cs — структуры и интерфейсы using System; interface IShape { // интерфейс

double Volume { get; } 11 объем double Area { get; } // поверхность

У

struct Circle: IShape // Круг

{

public double radius;

public Circle (double radius) 11 конструктор { 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 11 поверхность

{ 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 (Area={0,5:f2}; «.

+ «Volume={l, 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=1963j50; Volume= 0j00 Sphere: Area=201,06; Volume=268j08.

В методе Main () созданы объекты структур Circle и Sphere, которые в качестве аргументов передаются методу information (). Обратите внимание на отсутствие приведения типов в теле метода information ().

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

Как и классы, структура может реализовать одновременно несколько интерфейсов. Покажем на примере, как можно использовать эту возможность. Сначала объявим интерфейс такого вида:

interface Ilmage.

{

void displayQ; double Measure {get;} double BaseSize {set;}.

}

Члены этого интерфейса могут быть реализованы по-разному, т. е. им можно придать самый разный смысл. Пусть свойство Measure — это максимальный линейный размер («размах») геометрической фигуры; свойство BaseSize — базовый линейный размер; displayO — прототип метода, который выводит сведения о типе, реализовавшем интерфейс, и значения свойств Measure, BaseSize конкретного объекта. Такими типами в нашем примере будут структурные типы Cube и Square, представляющие, соответственно, объекты «куб» и «квадрат». Для куба базовый размер — ребро куба, максимальный размер — наибольшая диагональ. Для квадрата базовый размер — сторона квадрата, максимальный размер — его диагональ.

Предположим, что экземпляры этих структур мы хотим разместить в массиве и упорядочить элементы массива по убыванию значений свойства Measure. Для сортировки элементов массива можно применить метод Array. Sort (). Этот метод предполагает, что элементы массива сравниваются друг с другом с помощью метода CompareTo (). Прототип этого метода размещен в интерфейсе IComparable из пространства имен System. Метод СошрагеТо () уже определен для таких типов как int, char, string и т. д. Однако для пользовательских типов, которыми будут структурные типы Cube и Square, этот метод нужно определять явно. Поэтому реализуем в указанных структурах интерфейс IComparable. Тем самым в каждом из этих структурных типов с необходимостью появится такой нестатический метод:

public int CompareTo (object obj).

{

if (Measure <((Ilmage)obj).Measure) return +1; if (Measure ==((Ilmage)obj).Measure) return 0; else return -1;

}

Обратите внимание, что тип object параметра obj приводится к типу интерфейса Ilmage, который должны иметь элементы массива.

Напомним, что в коде метода Array. SortO выполняются многократные обращения к методу CompareToO, где при каждом обращении сравниваются характеристики двух элементов сортируемого массива. Если характеристика (в нашем примере свойство Measure) вызывающего элемента-объекта находится в «правильном» отношении к характеристике объекта-параметра, то метод CompareToO должен возвращать отрицательное значение. При нарушении «порядка» элементов возвращается положительное значение. Для элементов, одинаковых по характеристике сравнения, возвращается значение 0.

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

// 1513.cs — структуры и интерфейсы using System; interface Ilmage {.

void display (); double Measure { get; } double BaseSize { set; }.

}

struct Cube: Ilmage, IComparable // Куб

{

double rib; 11 ребро — базовый размер

public double Measure // максимальный линейный размер { get { return Math. Sqrt (3 * rib * rib); } } public double BaseSize { set { rib = value; } } public void display ().

{

string form = «Размеры куба: pe6po={0,7:f3}; размах={1,7НЗ}»; Console. WriteLine (form, rib. Measure);

}

public int CompareTo (object obj).

{

if (Measure < ((Ilmage)obj).Measure) return +1; if (Measure == ((Ilmage)obj).Measure) return 0; else return -1;

} }

struct Square: Ilmage, IComparable // Квадрат

{

double side; // сторона — базовый размер

public double Measure // максимальный размер { get { return Math. Sqrt (2 * side * side); } } public void display ().

{

string form = «Размеры квадрата: CTopoHa={0,7:f3}; размах={1,7НЗ}» ;

Console.WriteLine (form, side, Measure);

}

public double BaseSize { set { side = value; } } public int CompareTo (object obj).

{

if (Measure < ((Ilmage)obj).Measure) return +1; if (Measure == ((Ilmage)obj).Measure) return 0;

} }

class Program.

{

static void Main ().

{

Cube cube = new Cube (); cube. BaseSize = 5;

Square sq = new SquareQ; sq. BaseSize = 5;

Cube cubel = new CubeQ; cubel. BaseSize = 7;

IImage[] arlm = new IImage[] { cube, sq, cubel };

Array.Sort (arlm); foreach (Ilmage memb in arlm) memb. displayO;

}

>

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

Размеры куба: ребро= 7,000; размах= 12,124.

Размеры куба: ребро= 5,000; размах= 8,660.

Размеры квадрата: сторона= 5,000; размах= 7,071.

В методе Main () определены два экземпляра структуры Cube и один экземпляр структуры Square. С помощью свойства BaseSize заданы значения базовых размеров структур. Объявлен и инициализирован массив типа Ilmage []. Ссылка на него arlm использована в качестве аргумента метода Array. Sort (). Цикл foreach перебора элементов коллекции (в нашем примере перебираются элементы массива) последовательно обращается через ссылку memb типа Ilmage ко всем элементам упорядоченного массива. Для каждого элемента вызывается метод displayQ.

Контрольные вопросы и задания

  • 1. Как можно определить свой тип значений?
  • 2. Приведите формат объявления перечисления.
  • 3. Что такое базовый тип перечисления?
  • 4. Что такое список перечисления?
  • 5. Как инициализируются константы перечисления?
  • 6. Приведите правила обращения к константам перечисления.
  • 7. Какой тип имеет константа перечисления?
  • 8. Когда константа перечисления воспринимается как значение с базовым типом перечисления?
  • 9. Назовите операции, применимые к константам перечислений.
  • 10. Назовите операции, не применимые к константам перечислений.
  • 11. Где допустимо применять константы перечисления?
  • 12. Назовите статические методы типов перечислений.
  • 13. Как можно получить тип перечисления?
  • 14. В чем различия структурных типов и классов?
  • 15. Назовите допустимые модификаторы членов структурных типов.
  • 16. Назовите допустимые модификаторы структурных типов.
  • 17. Почему в структурных типах отсутствует финализатор?
  • 18. Объясните особенности копирования структур.
  • 19. Что называют упаковкой?
  • 20. Когда выполняется упаковка при работе со структурами?
  • 21. Объясните особенности и возможности класса ArrayList.
  • 22. К каким структурам применимы одинаковые методы?
  • 23. Что определяет интерфейс, реализованный структурным типом?
  • 24. В каком интерфейсе размещен прототип метода CompareToQ?
  • 25. Какой метод используется по умолчанию в методе ArraySortO для сравнения элементов сортируемого массива?
Показать весь текст
Заполнить форму текущей работой