|
Программирование >> Аргументация конструирования
Из дискуссии по вопросам объектно-ориентированной сфигософии : в части. 3 становится ясно, что в реальном, мире существует две вещи, которые нельзя выразить =- : сюмощьюфункционально-ориентированныхпрогралш. :\ Первое-это возможностьработы\с отдельными объектамыГ- . .Япривел пример использования микроволновой пени - У- ; для приготовления закуски. Она предоставляет интерфейс Ш (на лицевой панели), который я использую для управления, : совершенно не вникая в подробности работы печи. Ябуду вести себятпочно так же, даже если будузнвсе о том, : как именно она устроена (хотя я этогое заЮ). Второй аспект реального мира, [закрытый для функциональных программ, - это классификация объектов: J распознавание и использование их подобия. Если в рецепте приготовления того. или иного блюда указана Ш .. .. печь любоготипа, то, работая с микроволновой печью, - я буду уверен, что использую правильное устройство, поскольку микроволновая пень является Ъдним из типов печей.- :. . В предыдущей части вы познакомились с механизмом, Г : .. -. / используемым в С++для осуществления -- . -.:.Уопервойвозможностиобъектно-ориентированного-\:,-: V;:--:.;:;: программирования, - с классами. -- -- :-:-:-Дляобеспечея второй возможности€++ использует f ::-Ц&- концепцию, называемую наследованием, Г- которая расширяет понятие и возможности классов. Именно о наследовании и пойдетречьГвэой части книги. [. - <. - --. :-JV:- :-л. ........ vJ:. , ., ., .-.ji:;.-.; -. Гл21 Наследование классов взй главе... Зачем нужно наследование Как наследуется класс У Конструирование подкласса У Отношение СОДЕРЖИТ Г<. этой главе обсуждается наследование (inheritance), т.е. способность одного класса наследовать возможности иди свойства другого класса. Наследование - это общепринятая концепция. Я - человек (за исключением раннего утра...). И я наследую некоторые свойства класса Человек, например возможность говорить (в большей или меньшей степени), интеллект (надеюсь, что в большей степени), необходимость в воздухе, воде, пище и всяких витаминах. Эти свойства не являются уникальными для каждого отдельного человека. Очевидно, что класс Человек наследует зависимость от воды, воздуха и пищи у класса Млекопитающие, который, в свою очередь, наследует эти свойства у класса Животные. Концепция, в основе которой лежит способность передавать свойства по наследству, очень мошная. Благодаря ей можно значительно сэкономить место при описании реального объекта. Например, если мой сын спросит: Что такое утка? , я смогу сказать: Это птица, которая крякает . Несмотря на краткость, этот ответ несет в себе всю необходимую для описания утки (по крайней мере, для моего сына) информацию. Мой сын знает, что такое птица, и может понять, что утке присущи все свойства птицы плюс свойство кряканье . В объектно-ориентированных языках такая наследственная связь выражается в возможности одного класса наследовать другой. Таким образом, объектно-ориентированные языки позволяют создавать модели, более близкие к реальному миру (а именно для этого они и созданы), чем модели, построенные с помощью языков, не поддерживающих наследование. В C + + один класс может наследовать другой следующим образом: class Student class GraduateStudent lic Student { В этом примере GraduateStudent наследует все члены класса Student. Таким образом, GraduateStudent ЯВЛЯЕТСЯ студентом. Конечно, при этом GraduateStu-dent может также содержать уникальные, присущие именно ему члены. Занем нужно наследование Наследование fcuio включено в C + + по нескольким причинам. Конечно, основной из них была необходимость выражать связи между классами с помощью наследования (к этому я еще вернусь). Менее важной целью было уменьшение размера исходного кода. Представьте себе, что у вас есть класс Student и вас попросили добавить новый класс под названием GraduateStudent. В этом случае наследование значительно уменьшит количество членов, которые вам придется добавлять в класс. Все, что вам действительно нужно в классе GraduateStudent, - это члены, которые будут описывать отличия между студентами и аспирантами. С этим связана и более важная проблема - необходимость механизма повторного использования. Разработчики программного обеспечения на каком-то этапе поняли, что глупо начинать каждый новый проект с нуля, заново создавая одни и те же программные компоненты. Сравните ситуацию в области создания программных продуктов с другими сферами производства. Много ли вы знаете автомобилестроителей, которые начинают конструировать новый автомобиль с создания новгх гаек и винтов? Даже если отдельные компании так и делают, вряд ли будет легко отыскать среди них такие, которые начинают с разработки отверток и гаечных ключей. Разработчики из других областей давно знают, что гораздо эффективнее создавать новую машину из уже существующих гаек, винтов, креплений и даже более сложных агрегатов - компрессоров и двигателей. К сожалению, такая простая философия слишком мало практикуется в области программного обеспечения. За исключением ряда мелких функций, входящих в состав стандартных библиотек С, редко встретишь повторное использование программных компонентов. Одной из проблем, связанных с повторным использованием, является почти полная невозможность отыскать в готовой программе компонент, который бы отвечал всем вашим требованиям. Обычно все уже существующие компоненты приходится дописывать и переписывать перед применением в данном приложении (как если бы работа по созданию самолета состояла в том, чтобы убрать с помощью напильника все лишнее у паровоза...). В программировании есть правило: Если ты что-то открыл, значит, ты это уже сломал . Другими словами, если вам пришлось переписать функцию или класс, чтобы приспособить ее к новому приложению, то вам придется заново протестировать всю функцию, а не только те части, которые вы изменили. Изменения могут внести ошибки в любое место существующего кода. Наследование позволяет приспосабливать существующие классы к новым приложениям, не внося изменений в их внутреннее устройство. Существующий класс наследуется новым подклассом, который и будет содержать все необходимые добавления и изменения. Это приводит нас к третьему преимуществу наследования. Представьте себе, что вы наследуете некий существующий класс. Затем вы находите, что базовый класс содержит ошибку, которую нужно исправить. Если бы вы переделывали класс для его повторного использования, вам бы пришлось вручную проверить новый класс, отыскивая ошибку в каждом отдельно взятом приложении. Однако если вы наследовали класс без изменений, то можете без особых хлопот заменить старую версию класса новой. потрясающе : Люди составляют обширные системы, чтобы было проще разбираться в том, что их окружает. Тузик является частным случаем собаки, которая является частным случаем собакообразных, которые входят в состав млекопитающих, и т.д. Так легче познавать мир. Если использовать другой пример, можно сказать, что студент является человеком (точнее, его частным случаем). Как только это сказано, я уже знаю довольно много ;> о студентах (об американских студентах, естественно). Я знаю, что они имеют но- ; мера социального страхования, что они слишком много смотрят телевизор и по стоянно мечтают о сексе. Я знаю все это потому, что это свойства всех людей.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |