Г. Шилдт - С#4.0 Полное руководство (1160795), страница 202
Текст из файла (страница 202)
ьпч.йс(с)(пен 1пчепгсгу("Кусачки", 5.95, 3)); гпч.йсЫ (пеи 1пчепгсгу("Отвертки", 8.29, 2))г гпч.йсЫ (пен 1пчепгсгу("Молотки", 3.50, 4)); гпч.йсЫ (пен 1пчепясгу("Дрели", 19.88, 8)); Сспяо1е.иг1севдпе("Перечень товарных запасов:"); 1сгеясй(1пчепгсгу г ьп гпч) ( Сспяс1е.нгггеъьпе(" " ь 1)г ) )зава 25. ((омекции, перечисянтеян и итераторы 989 При выполнении программы из данного примера получается следующий результат. Перечень товарных запасов: Кусачки Стоимость: 85.95 Отвертки - Стоимость: 88.29 Молотки Стоимость: 83.50 Дрели Стоимость: 819.88 Наличие: 3 Наличие: 2 Наличие: 4 Наличие: 8 Пример сохранения обьектов класса 1пчептогу в О обобщенной коллекции класса ьгяг<т>.
пзгпч Яуягев; иягпд Яуятев.со11ест1опя.оепег1сс с1аяз 1пчептогу ( ятг1п0 паве; бооЬ1е созс; упт опьапбс рп)>11с 1пчептогу(ятггпч и, боп)>1е с, 1пт А) ( паве = и; созг = с; опьапб = Го ) рп)>11с очеггтбе ятгьпч тозтг1пч() ( гегвгп Ятг1пч . Гогват ("( О, -10 )Стоимость: ( 1, б:С) Наличие: ( 2 ) ", папе, спят, опаапб)1 с1аяя туреЯаге1пчептогуьгяс ( ятат1с чотб Ма1п() ( Ь1зг<1пчептогу> упч = пен Ь1ят<1пчептогу>() // Добавить элементы в список.
упч.хсЫ(пен 1пчептоту("Кусачки", 5.95, 3)); ).пч.хсЫ (пен 1пчептоту("Отвертки", 8.29, 2)); гпч.хсЫ(пен 1пчептогу("Молотки", 3.50, 4)); 1пч/АсЫ(пен 1пнептогу("Дрели", 19.88, 8)); Обратите внимание на то, что в данном примере программы не потребовалось никаких специальных действий для сохранения в коллекции объектов типа 1пче и С о ту.
Благодаря тому что все типы наследуют от класса о)>3 ест, в необобщенной коллекции можно хранить объекты любого типа. Именно поэтому в необобщенной коллекции нетрудно сохранить объекты определяемых пользователем классов. Безусловно, это также означает, что такая коллекция не типизирована. Для того чтобы сохранить объекты определяемых пользователем классов в типизированной коллекции, придется воспользоваться классами обобщенных коллекций. В качестве примера ниже приведен измененный вариант программы из предыдущего примера. В этом варианте используется класс обобщенной коллекции П1яс<т>, а результат получается таким же, как и прежде. 990 Часть Н. Библиотека С() Соззо1е.иг1сеъьзе(юперечень товарных запасов:")1 Гогеасз(тптепгоху г гз 1зт) ( Сопзо1е.иг1сеъгпе(" " + 1); ) Данный пример отличается'от предыдущего лишь передачей типа 1пчеззогу в качестве аргумента типа конструктору класса 11зг<Т>.
А в остальном оба примера рассматриваемой здесь программы практически одинаковы. Это, по существу, означает, что для применения обобщенной коллекции не требуется никаких особых усилий, но при сохранении в такой коллекции объекта конкретного типа строго соблюдается типовая безопасность. Тем не менее для обоих примеров рассматриваемой здесь программы характерна еще одна особенность: они довольно кратки.
Если учесть, что для организации динамического массива, где можно хранить, извлекать и обрабатывать данные товарных запасов, потребуется не менее 40 строк кода, то преимущества коллекций сразу же становятся очевидными. Нетрудно догадаться, что рассматриваемая здесь программа получится длиннее в несколько раз, если попытаться закодировать все эти функции коллекции вручную. Коллекции предлагают готовые решения самых разных задач программирования, и поэтому их следует использовать при всяком удобном случае.
У рассматриваемой здесь программы имеется все же один не совсем очевидный недостаток: коллекция не подлежит сортировке. Дело в том, что в классах Аггау11зг и 11зс<т> отсутствуют средства для сравнения двух объектов типа 1зчезсогу. Но из этого положения имеются два выхода. Во-первы)С в классе 1нчеззогу можно реализовать интерфейс 1 Созтра гаЬ1е, в котором определяется метод сравнения обьектов данного класса. И во-вторых, для целей сравнения можно указать объект типа 1Солтрагег.
Оба подхода рассматриваются далее по очереди. Реализация интерфейса 1Соп)ракаЪ1е Если требуется отсортировать коллекцию, состоящую из объектов определяемого пользователем класса, при условии, что они не сохраняются в коллекции класса Яогзес(11зз, где элементы располагаются в отсортированном порядке, то в такой коллекции должен быть известен способ сортировки содержащихся в ней объектов.
С этой целью можно, в частности, реализовать интерфейс 1СовтрагаЬ1е для объектов сохраняемого типа. Интерфейс 1СотлрагаЬ1е доступен в двух формах: обобщенной и необобщенной. Несмотря на сходство применения обеих форм данного интерфейса, между ними имеются некоторые, хотя и небольшие, отличия, рассматриваемые ниже. Реализация интерфейса 1Сотт(рака?йе для необобщенных коллекций Если требуется отсортировать объекты, хранящиеся в необобщенной коллекции, то для этой цели придется реализовать необобщенный вариант интерфейса 1СоырагаЬ1е.
В этом варианте данного интерфейса определяется только один метод СовтрагеТо (), который определяет порядок выполнения самого сравнения. Ниже приведена общая форма объявления метода Соврз геТо () . Тнг Созрагето(оь)есс ззт) Гааза 25. Кпмекции, перечисаптеви и втерагпры 991 В методе СоврагеТо () вызывающий объект сравнивается с объектом оЬ11 Для сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающего объекта больше, чем у объекта оЬу; и отрицательное — если значение вызывающего объекта меньше, чем у объекта оЬ11 А для сортировки по убывающей можно обратить результат сравнения объектов.
Если же тип объекта обу не подходит для сравнения с вызывающим объектом, то в методе СоврагеТо () может быть сгенерировано исключение )(гдпвепСЕхсерС1оп. В приведенном ниже примере программы демонстрируется конкретная реализация интерфейса 1СоврагаЬ1е. В этой программе интерфейс 1СоврагаЬ1е вводится в класс 1пнепСогу, разработанный в двух последних примерах из предыдущего раздела. В классе 1пчепСогу реализуется метод СоврагеТо () для сравнения полей паве объектов данного класса, что дает возможность отсортировать товарные запасы по наименованию. Как показано в данном примере программы, коллекция объектов класса 1пчепгогу подлежит сортировке благодаря реализации интерфейса 1СоврагаЬ1е в этом классе. !/ Реализовать интерфейс 1ссврагаЫе. оя1пэ Яуягев; оя1пд Яувоев.Со11есогопя; Реализовать необобщенный вариант интерфейса 1СоврагаЬ1е.
с1ава 1пчепоогу : 1СоврагаЫе ( ясг1пд паве; бооЫе сояг( 1пс оппапб1 рпЫьс 1пнепгогу(ягг1пч и, бооЬ1е с, гпС Ы ( паве = и; сояС = с; оппапб = Ь; ) роЫгс очегггбе ягг1пс тоягг1пэ() геопгп ягггпэ. РопяаС ("( О, -10 )Стоимостьо ( 1, б:С ) Наличие: (2 ) ", паве, сояС, оппапб); Реализовать интерфейс 1СоврагаЬ1е. рпЫгс гпС Соврагето(оЬЗесг оЬ1) ( 1пнепСогу Ь; Ь = (1пнепгогу) оЬГП гегпгп паве.соврагето(Ь.паве)~ ) с1аяя 1СоврагаЫебево ( ягасгс чогп нагл() ( вггауьгяс гпч = пен пггауььяс() О )(сбавить элементы в список. 992 Часть Н. Библиотека С() Тпч.ьс)С(пен 1пчепсогу("Кусачки", 5.95, 3) ); гпч.дс)С(пеы 1пчепсогу("Отвертки", 8.29, 2)); 1пн.ас)С(пеы 1пчепсогу("Молотки"„ 3.50, 4)); 1пч.АСс)(пеы 1пчепсогу("Дрели", 19.88, 8)); Сопзо1е.ыгъсеътпе("Перечень товарных запасов до сортировки:"); йогеась(1пнепсогу г гп Тпч) ( ,Сопво1е.иг1сеьгпе(" " + ).); ) Сопзо1е.нгтгеъгпе(); // Отсортировать список.
Тпч.зогс(); Сопво1е.нгъсеьгпе("Перечень товарных запасов после сортиравкис") ГогеасЛ(1пчепгогу г ьп Тпч) ( Сопво1еЛггсеъгпе(" " + 1); ) Ниже приведен результат выполненил данной программы. Обратите внимание на то, что после вызова метода Ногс () товарные запасы оказываютсл отсортированными по наименованию. Перечень товарных запасов до сортировки: Стоимость: $5.95 Стоимость: $8.29 Стоимость: $3.50 Стоимость: $19.88 Наличие: 3 Наличие: 2 Наличие: 4 Наличие: 8 Кусачки Отвертки Молотки Дрели Реализация интерфейса ХСоа)рахаЬ1е Для обобщенных коллекций Если требуется отсортировать объекты, хранящиеся в обобщенной коллекции, то длл этой цели придется реализовать обобщенный вариант интерфейса 1СоырагаЬ1е<Т>.
В этом варианте интерфейса 1СомрагаЬ1е определяется приведенная ниже обобщенная форма метода соыра гето (), гпг СозрагеТо(Т огьег) В методе Сомрагето () вызывающий объект сравниваетсх с другим объектом осЛег. Длл сортировки объектов по нарастающей конкретная реализация данного метода должна возвращать нулевое значение, если значения сравниваемых объектов равны; положительное — если значение вызывающйго объекта больше, чем у объекта другого о Слег) и отрицательное — если значение вызывающего объекта меньше, чем у другого объекта о слег. А для сортировки по убывающей можно обратить результат сравнения объектов. При реализации обобщенного интерфейса 1СомрагаЬ1е<Т> имл типа реализующего класса обычно передается в качестве аргумента типа.
Перечень Дрели Кусачки Молотки Отвертки товарных запасов после сортировки: Стоимость: $19.88 Наличие: 8 Стоимость: $5.95 Наличие: 3 Стоимость: $3.50 Наличие: 4 Стоимость: $8.29 Наличие: 2 Глава 2б. Коллекции, веречислители и итераторы 993 Приведенный ниже пример программы является вариантом предыдущего примера, измененным с целью реализовать и использовать обобщенный интерфейс 1сошрагаЫе<т>.