Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 196

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 196 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 1962018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 196)

Часто, абстрактные типы не предназначены для порождения производных классов, отличных от классов непосредственной реализации. Однако из абстрактного класса можно сконструировать новый интерфейс, породив расширенный производный класс. Этот новый интерфейс (новый абстрактный класс) также нужно реализовать посредством неабстрактных производных классов 615.2.5).

Почему же мы сразу не породили бЫ и Ресгог от Яег, избежав введения классов Изг зег и Ресгог лег? Иными словами, зачем нам потребовались конкретные типы вместо абстрактных типов? Здесь нужно учитывать следующие соображения: 903 25.4. Узловые классы 1. Эффективность. Нам могут потребоваться конкретные типы, вроде гес<ог и !а<, без затрат на отделение интерфейса от реализации (сопутствуют стилю абстрактных классов). 2. Повторное использование.

Нам нужен механизм приспособления спроектированных вовне типов (вроде гес<ог и !!з<) в новые библиотеки или программы путем предоставления для них нового интерфейса (а не путем переписывания их кода). 3. Множественные интерфейсы. Использование одного класса в качестве базового для многих классов приводит к жирным интерфейсам (з24.4.3). Для новых задач лучше снабдить класс новым интерфейсом (вроде интерфейса Яе< для зес<ог), чем приспосабливать старый интерфейс под новые задачи.

Естественно, эти положения связаны между собой. Подробно они обсуждались на примере Ьа! Ьох (в12.4.2, з15.2.5), а также в контексте проектирования контейнеров (в16.2). 25.4. Узловые классы Часто классовые иерархии используют наследование не в том ключе, как в случае абстрактного класса, предоставляющего интерфейс к реализациям. Здесь класс рассматривается в качестве фундамента, на котором строится часть системы.

Даже, если этот класс абстрактный, он все равно имеет некоторое представление, обеспечивающее услуги своим производным классам. Примерами узловых классов служат Ро!убоп (З!2.3), первоначальный вариант Ьа! з!!<(ег ®2.4.1) и Яа<е!!!<е Я15.2). В типичном случае, класс иерархии представляет собой некоторую концепцию, для которой производные классы могут рассматриваться как специализации этой концепции. Узловой класс (по<<е с<азз) иерархии использует сервисы базового класса для того, чтобы предоставлять свои собственные сервисы; для этого он вызывает функции-члены базового класса. Типичный узловой класс не только реализует интерфейс, описанный базовым классом (как это для абстрактного типа делает класс реализации), но и добавляет свои собственные функции, обеспечивая тем самым расширенный интерфейс. Рассмотрим класс Саг из примера моделирования уличного движения в в24.3.2; с<вез Сог: р»в<<с Уел<с<е ( рибдс< Саг(<п< раззепеегз, 5<ее со<ело<уз<ее, Ь» ив<ел<, <п<зс) : Уел<с<в (раззепаегз, з<ле, <ге<вл<), !йе! сарае<<у (ус) ( /*...

* ! ) << замещаем виртуальные функции из )'еЫс<е: го<а' <игп (2у<гес<<оп ); ,<< .. о' добавляем специфические автомобильные функции: г<г<иа! вой! а«<! <ие! Пп< атоип<); д заправка топливом 904 Глава 25. Роли классов Здесь важны конструкторы, через которые программист задает основные моделируемые свойства, и виртуальные функции, позволяющие моделирующим уличное движение операциям манипулировать транспортным средством, не зная его точного типа. Класс Саг можно использовать следующим образом: ыоЫ изег() ( У... Саг* р = пеп Саг(З,есоиоту,1500, бб); дгпе (р, Ьз йоте, МН) / У входим в общую схему имитации уличного движения //...

) Обычно узловому классу нужны нетривиальные конструкторы. Этим он отличается от абстрактных типов, которые редко когда имеют конструкторы. Операции над классом Саг в своих реализациях будут, как правило, пользоваться операциями базового класса КеИс1е. Кроме того, пользователь класса Саг также рассчитывает на услуги базового класса. Например, базовый класс Рейс1е предоставляет функции, имеющие дело с весом и размерами, так что классу Саг нет нужды этим заниматься: Ьоо! ВгЫле:: сап сговв (сопл! )гей!с!еа г) ( () (тах ыые!Вй < г.

не!Вйг() ) гегигп 1ане; У... Это позволяет программистам создавать из узлового класса Ьей1с!е новые классы, такие как Саг и Тгисй, специфицируя и реализуя лишь то, что должно быть отличным от Кейс1е. Это часто называют «программированием отличий», Как и многие узловые классы, класс Саг является хорошей кандидатурой для порождения производных классов.

Например, АтЬи1апсе (скорая помощь) нуждается в дополнительных данных и функциях, связанных с экстренностью службы: с!азз АтЬи!апсе: риЫЫ Саг, риЫЫ Етегяеясу ( риЫ(с: АтЬи!апсе (); // замещаем виртуальные функции из Саг: ыо!й гиги (Р!гес!!оп ); У... //замещаем виртуальные функции из Етегдепсу: Ыпиа! ыоЫ «!!врагсй !о (сопи Еоса!!оп а ); // ... //добавляем специфические для Атьи!апсе функции: иггиа! 1пг рабепг сарасйу (); У количество носилок // ... 905 25,4.

Узловые классы Подводя итог, можно сказать, что узловой класс: 1. Опирается на базовые классы как с целью реализации, так и для предоставления услуг своим пользователям. 2. Обеспечивает более широкий интерфейс (с большим числом открытых функций-членов) по сравнению с базовыми классами. 3. В своем открытом интерфейсе опирается в первую очередь (но не исключительно) на виртуальные функции. 4.

Зависит (прямо или косвенно) от всех своих базовых классов. 5. Может быть понят только в контексте своих базовых классов. 6. Полезен для дальнейшего порождения классов наследованием. 7. Используется для создания объектов. Не все узловые классы будут удовлетворять пунктам 1, 2, 6 и 7, но большинство будет. Класс, не удовлетворяющий пункту 6, напоминает конкретный тип, так что его можно назвать конкретным узловым классом (сопсге(е поде с(аьв).

Например, конкретный узловой класс может использоваться для реализации абстрактного класса (912.4.2), а его объекты могут создаваться статически и в стеке. Такой класс также называют листовым классом ((еа('с(авв). Отметим, что любой код, оперирующий указателем или ссылкой на класс с виртуальными функциями, должен учитывать возможность появления дальнейших производных классов (или предположить, без прямой языковой поддержки, что дальнейших классов не будет).

Класс, не удовлетворяющий пункту 7, напоминает абстрактный тип и может быть назван абстрактным узловьии классом (абв(гас( поде с(аев). По сложившейся традиции (неудачной) многие узловые классы имеют ряд защищенных членов, чтобы не слишком сильно ограничивать интерфейс для производных классов (912.4.1.1). Пункт 4 подразумевает, что для компиляции узлового класса программист должен включить объявления всех его прямых и непрямых базовых классов, а также все объявления, от которых зависят последние. В этом отношении узловой класс опять-таки отличается от абстрактных классов — пользователь последних не зависит от классов реализации и может не включать для компиляции своего кода информацию об этих классах.

25.4.1. Изменение интерфейсов По определению, узловой класс является частью классовой иерархии. Не все классы иерархии должны предоставлять один и тот же интерфейс. В частности, производные классы могут предоставлять дополнительные функции-члены, а классы одного и того же уровня иерархии (з)Ь1)пя с1аззез) — совершенно иной набор функций. С проектной точки зрения операция дупака(с савг (915.4) представляется механизмом опроса объектов на предмет, обеспечивают ли они данный интерфейс.

Для примера рассмотрим простую систему ввода/вывода объектов. Пользователи хотят читать объекты из потока, определять, относятся ли они к ожидаемому типу, после чего использовать эти объекты. Например: ко(д ивег() 1 д' открываем файл нредположительно с фигуралеи типа Бпаре и прикрепллем д'ев в качестве йтеат длл этого файла 90б Глава 25. Роли классов //... 1о оЬ/* р = ае< оЬ1'(зз); //читаем обьект из потока зз (БЬаре* зр = Йупатгс сазгсЯЬаре*> (р) ) ( зр->девы (); /У,,, ) е!зе ( //оорз: это не сааре ) // используем 5Ьаре с!аев 1о оЬ1 ( риЫ(с: г(ггиа1 1о оЬ1* с1опе() сопл! =0; тг!иа1 -1о оЬ! ( ) ( ) )' Критически важной функцией в системе объектного ввода/вывода является функция яе! оЬ1 ( ), которая считывает данные из потока 1з!геат и создает объекты на основании этих данных. Предположим, что данные, представляющие обьект в потоке ввода, предваряются строкой, идентифицирующей класс объекта.

Функция яе! оЬ1() должна прочесть этот строковый префикс и вызвать функцию, способную создать и инициализировать объект надлежащего класса. Например: (урейе~1о оЬ1* (*Рр) (1з!геать); тор<лег/па, РР' штар; Ьоо(яе! нюгб(иггеать 1з, з!г/пяь з); 1о оЬ/* яе! оЬ1'(/зггеать з) ( з!Мпя згг; Ьоо! Ь = ае! ыогд (з, згг); В (Ь==/а!зе) гагат р/о с!аьв(); Ррг' = !о тар(з!г]; Ц ~==0) олсон (/пйповп с(аев (); ге!игл /( з); // читает слово из И в з // читаем слова в зо. // проблемы с форматом ввода/вывода // выбираем функцию по мг /У длн з(г соответствии не найдено /У конструируем обьект из потока Функция изег() работает с фигурами исключительно посредством абстрактного класса Маре и может поэтому пользоваться любыми фигурами.

Динамическое приведение типа посредством операции Иупага]с саз! здесь весьма существенно, ибо система объектного ввода/вывода может иметь дело со многими другими видами объектов, а пользователь может непреднамеренно открыть файл с объектами классов, о которых он никогда не слышал. Система объектного ввода/вывода предполагает, что каждый записанный или считанный объект относится к классу, производному от 1о оЬ1. Класс 1о оЬ1 должен быть полиморфным типом, чтобы разрешить нам применять операцию булат]с сит!. Например: 25.4. Узловые классы 907 Ассоциативный массив типа тар, названный <о тар, содержит пары из имен, классов и функций, способных создавать объекты этих классов. Мы могли бы определить класс ойаре обычным образом, кроме того, что его нужно сделать производным от 1о оЬ1, как того требует функция изег(): сй<зз Яйаре: риЫк 1о оЬ1' ( (<' ...

): Однако интереснее (и реалистичнее) воспользоваться ранее определенным классом ойаре (92.6.2) без изменений: с<азз1о скс1е< риЫк С!<с<е, риЫ!с!о оЬ!' ( риЫ<с < 1о сйс<е* с1опе () сопл< (ге<игп пе<г 1о с!гс1е (*<й!з) < ) 1о с!гс1е(<в<свата) < (инициализация из потока ввода з<ацс<о оЬ!* ие<г сйс<е(!з<геата з) (гетгп пен 1о с1гс1е(з) < ) р.,, )< Этот пример показывает, насколько легче вписать класс в иерархию при помощи абстрактного класса, чем если бы мы в первую очередь рассматривали его в качестве узлового (9]2.4.2, 925.3).

Характеристики

Тип файла
DJVU-файл
Размер
8,84 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6473
Авторов
на СтудИзбе
304
Средний доход
с одного платного файла
Обучение Подробнее