15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс

15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс

^ 15.5. Реализация структурами интерфейсов
Применение 1-го базисного класса с виртуальными членами позволяет единообразно обрабатывать объекты различных типов, любой из которых является производным от базисного и переопределяет его виртуальные члены.

Таковой способности для экземпляров разнотипных 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс структур нет, т.к. структуры не наследуются. Но структуры могут реализовывать интерфейсы. Если несколько структурных типов реализуют один и тот же интерфейс, то к объектам этих различных структур применимы способы (также характеристики 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс, индексаторы и действия) интерфейса. Тем интерфейсы позволяют идиентично обрабатывать объекты различных структурных типов. Для этого ссылка на интерфейс употребляется в качестве параметра, заместо которого могут подставляться аргументы структурных типов, реализующих данный интерфейс. 2-ой пример 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс – применение коллекций (личный случай – массивов), элементы которых имеют различные структурные типы. Создание такового массива может быть, если он объявлен с типом интерфейса, реализованного всеми структурными типами.

В качестве примера 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс определим интерфейс с образцами параметров:

interface IShape {

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

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

}

Воплотить таковой интерфейс можно при помощи различных классов и структур. К примеру, параллелепипед имеет площадь поверхности (Area) и объём (Volume 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс). Те же характеристики имеются у хоть какой трёхмерной геометрической фигуры. Воплотить тот же интерфейс можно и в классе двумерных фигур. В данном случае объём будет равен нулю.

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

static 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс void information (IShape sh)

Его предназначение – вывести данные об объекте, ссылка на который употребляется в качестве аргумента. Тип параметра – это интерфейс, потому способ сумеет обрабатывать объекты всех типов, реализующих интерфейс 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс IShape.

В последующей программке определены две структуры, реализующие интерфейс IShape. 1-ая из их Circle – представляет круги с данными значениями радиусов, 2-ая Sphere – сферы с данными значениями радиуса. Способ information() выводит сведения об аргументе. Текст программки 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс:

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

using System;

interface IShape

{

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

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

}

struct Circle : IShape // Круг

{

public double radius;

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

{ this.radius = radius; }

public double Area 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс { 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 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс; } }

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 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс);

}

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() сделаны объекты структур 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс Circle и Sphere, которые в качестве аргументов передаются способу information(). Направьте внимание на отсутствие приведения типов в теле способа information(). Если б его параметр имел тип object, то нужно было бы делать 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс преобразование к типу определенного аргумента.

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

interface IImage {

void display();

double 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс Measure {get;}

double BaseSize {set;}

}

Члены этого интерфейса могут быть реализованы по-разному, другими словами им можно придать самый различный смысл. Пусть свойство Measure – это наибольший линейный размер («размах») геометрической фигуры; свойство 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс BaseSize – базисный линейный размер; display() – макет способа, который выводит сведения о типе, реализовавшем интерфейс, и значения параметров Measure, BaseSize определенного объекта. Такими типами в нашем примере будут структуры Cube и Square, представляющие, соответственно, объекты «куб 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс» и «квадрат». Для куба базисный размер – ребро куба, наибольший размер – большая диагональ. Для квадрата базисный размер – сторона квадрата, наибольший размер – его диагональ.

Представим, что объекты этих структур мы желаем расположить в 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс массиве и упорядочить элементы массива по убыванию значений характеристики Measure. Для сортировки частей массива можно применить способ Array.Sort(). Этот способ подразумевает, что элементы массива сравниваются вместе при помощи способа CompareTo 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс(). Макет этого способа размещён в интерфейсе IComparable из места имён System. Способ CompareTo() уже определён для таких типов как int, char, string и т.д.. Но для пользовательских типов, которыми будут структуры Cube и 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс Square, этот способ необходимо определять очевидно. Потому реализуем в обозначенных структурах интерфейс IComparable. Тем в каждой из этих структур с необходимостью появится таковой нестатический способ:

public int CompareTo (object obj 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс)

{

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

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

else return -1;

}

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

Напомним 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс, что в коде способа Array.Sort() производятся неоднократные воззвания к способу CompareTo(), где сравниваются свойства 2-ух частей сортируемого массива. Если черта (в нашем примере свойство Measure) вызывающего элемента-объекта находится в «правильном» отношении 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс к характеристике объекта-параметра, то способ CompareTo() должен возвращать отрицательное значение. При нарушении «порядка» частей ворачивается положительное значение. Для частей, схожих по характеристике сопоставления, ворачивается значение 0.

Программка с обозначенными структурами может 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс быть таковой:

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

using System;

interface IImage

{

void display();

double Measure { get; }

double BaseSize { set; }

}

struct Cube : IImage, IComparable // куб

{

double rib; // ребро - базисный размер

public double Measure // наибольший линейный размер

{ get { return 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс Math.Sqrt(3 * rib * rib); } }

public double BaseSize { set { rib = value; } }

public void display()

{

string form = "Размеры куба: ребро={0,7:f3}; размах={1,7:f3}";

Console.WriteLine(form, rib, Measure);

}

public int CompareTo(object obj)

{

if 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс (Measure < ((IImage)obj).Measure) return +1;

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

else return -1;

}

}

struct Square : IImage, IComparable // квадрат

{

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

public double Measure // наибольший размер

{ get { return Math.Sqrt(2 * side * side); } }

public 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс void display()

{

string form = "Размеры квадрата: сторона={0,7:f3}; размах={1,7:f3}";

Console.WriteLine(form, side, Measure);

}

public double BaseSize { set { side = value; } }

public int CompareTo(object obj)

{

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

if (Measure == ((IImage 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс)obj).Measure) return 0;

else return -1;

}

}

class Program

{

static void Main()

{

Cube cube = new Cube();

cube.BaseSize = 5;

Square sq = new Square();

sq.BaseSize = 5;

Cube cube1 = new Cube();

cube1.BaseSize = 7;

IImage[] arIm = new IImage 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс[] { cube, sq, cube1 };

Array.Sort(arIm);

foreach (IImage memb in arIm)

memb.display();

}

}


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

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

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

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


В способе Main( ) определены 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс два экземпляра структуры Cube и один экземпляр структуры Square. При помощи характеристики BaseSize заданы значения базисных размеров структур. Объявлен и инициализирован массив типа IImage[ ]. Ссылка на него arIm применена в качестве аргумента способа 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс Array.Sort(). Цикл foreach перебора частей коллекции (в нашем примере массива) поочередно обращается через ссылку memb типа IImage ко всем элементам упорядоченного массива. Для каждого элемента вызывается способ display().


Контрольные вопросы


  1. Как 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс можно найти собственный тип значений?

  2. Приведите формат объявления перечисления.

  3. Что такое базисный тип перечисления?

  4. Что такое перечень перечисления?

  5. Как инициализируются константы перечисления?

  6. Приведите правила воззвания к константам перечисления.

  7. Какой тип имеет константа перечисления 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс?

  8. Когда константа перечисления воспринимается как значение с базисным типом перечисления?

  9. Перечислите операции, применимые к константам перечислений.

  10. Назовите операции, не применимые к константам перечислений.

  11. Где допустимо использовать константы перечисления?

  12. Назовите 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс статические способы типов перечислений.

  13. Как можно получить тип перечисления?

  14. В чём различия структур и классов?

  15. Назовите допустимые модификаторы структур.

  16. Что такое интерфейсы структуры?

  17. Почему в структурах отсутствует финализатор?

  18. Растолкуйте особенности копирования структур.

  19. Что 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс именуют упаковкой?

  20. Когда производится упаковка при работе со структурами?

  21. Растолкуйте особенности и способности класса ArrayList.

  22. К каким структурам применимы однообразные способы?

  23. Что определяет интерфейс, реализованный структурой?

  24. В каком интерфейсе размещён макет способа 15.5. Реализация структурами интерфейсов - В. В. Подбельский Язык C#. Базовый курс CompareTo()?

  25. Какой способ употребляется в способе ArraySort() для сопоставления частей сортируемого массива?





15osobie-polozheniya-v-svyazi-s-provedeniem-zaprosa-predlozhenij-na-elektronnoj-torgovoj-ploshadke-b2b-mrskru.html
15poyasneniya-k-prilozheniyu-k-buhgalterskomu-balansu-poyasnitelnaya-zapiska-k-godovoj-buhgalterskoj-otchetnosti-oao-ohk-uralhim.html
15prochie-polozheniya-izveshenie-o-provedenii-otkritogo-zaprosa-predlozhenij.html