Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Топ:
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2017-10-11 | 291 |
5.00
из
|
Заказать работу |
Вернемся к классу Rational, спроектированному в предыдущей лекции. Очевидно, что его вполне разумно представить в виде структуры. Наследование ему не нужно. Семантика присваивания развернутого типа больше подходит для рациональных чисел, чем ссылочная семантика, ведь рациональные числа - это еще один подкласс арифметического класса. В общем, класс Rational - прямой кандидат в структуры. Зададимся вопросом, насколько просто объявление класса превратить в объявление структуры? Достаточно ли заменить слово class словом struct? В данном случае одним словом не обойтись. Есть одно мешающее ограничение на структуры. В конструкторе класса Rational вызывается метод nod, а вызов методов в конструкторе запрещен. Нетрудно обойти это ограничение, изменив конструктор, то есть явно задав вычисление общего делителя в его теле. Приведу текст этого конструктора:
public struct Rational{ public Rational(int a, int b) { if(b==0) {m=0; n=1;} else { //приведение знака if(b<0) {b=-b; a=-a;} //приведение к несократимой дроби int p = 1, m1=a, n1 =b; m1=Math.Abs(m1); n1 =Math.Abs(n1); if(n1>m1){p=m1; m1=n1; n1=p;} do { p = m1%n1; m1=n1; n1=p; }while (n1!=0); p=m1; m=a/p; n=b/p; } }//Конструктор//поля и методы класса}Все остальное остается без изменения. Приведу пример работы с рациональными числами, представленными структурой:
public void TwoSemantics(){ Rational r1 = new Rational(1,3), r2 = new Rational(3,5); Rational r3, r4; r3 = r1+r2; r4 = r3; if(r3 >1) r3 = r1+r3 + Rational.One; else r3 = r2+r3 - Rational.One; r3.PrintRational("r3"); r4.PrintRational("r4");}В этом примере используются константы, работает статический конструктор, закрытый конструктор, перегруженные операции сравнения, арифметические выражения над рациональными числами. В результате вычислений r3 получит значение 8/15, r4- 14/15. Заметьте, аналогичный пример для класса Rational даст те же результаты. Для класса Rational и структуры Rational нельзя обнаружить разницу между ссылочным и развернутым присваиванием. Это связано с особенностью класса Rational - он по построению относится к неизменяемым (immutable) классам, аналогично классу String. Операции этого класса не изменяют поля объекта, а каждый раз создают новый объект. В этом случае можно считать, что объекты класса обладают присваиванием развернутого типа.
Встроенные структуры
Как уже говорилось, все значимые типы языка реализованы структурами. В библиотеке FCL имеются и другие встроенные структуры. Рассмотрим в качестве примера структуры Point, PointF, Size, SizeF и Rectangle, находящиеся в пространстве имен System.Drawing и активно используемые при работе с графическими объектами. Первые четыре структуры имеют два открытых поля X и Y (Height и Width), задающие для точек - структур Point и PointF - координаты, целочисленные или в форме с плавающей точкой. Для размеров - структур Size и SizeF - они задают высоту и ширину, целочисленными значениями или в форме с плавающей точкой. Структуры Point и Size позволяют задать прямоугольную область - структуру Rectangle. Конструктору прямоугольника можно передать в качестве аргументов две структуры - точку, задающую координаты левого верхнего угла прямоугольника, и размер - высоту и ширину прямоугольника.
Между четырьмя структурами определены взаимные преобразования: точки можно преобразовать в размеры и наоборот, сложение и вычитание определено над точками и размерами, но не над точками, плавающий тип которых разными способами можно привести к целому. Ряд операций над этими структурами продемонстрирован в следующем примере:
public void TestPointAndSize(){ Point pt1 = new Point(3,5), pt2 = new Point(7,10), pt3; PointF pt4 = new PointF(4.55f,6.75f); Size sz1 = new Size(10,20), sz2; SizeF sz3 = new SizeF(10.3f, 20.7f); pt3 = Point.Round(pt4); sz2 = new Size(pt1); Console.WriteLine ("pt1: " + pt1); Console.WriteLine ("sz2 =new Size(pt1): " + sz2); Console.WriteLine ("pt4: " + pt4); Console.WriteLine ("pt3 =Point.Round(pt4): " + pt3); pt1.Offset(5,7); Console.WriteLine ("pt1.Offset(5,7): " + pt1); Console.WriteLine ("pt2: " + pt2); pt2 = pt2+ sz2; Console.WriteLine ("pt2= pt2+ sz2: " + pt2);}//TestPointAndSizeРезультаты его выполнения показаны на рис. 17.1
Рис. 17.1. Операции над точками и размерами
Отметим, что метод ToString, определенный для этих структур, выдает строку со значениями полей в приемлемой для восприятия форме.
17. Лекция: Структуры и перечисления
17.3
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!