Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопрос-ответ 2013.doc
Скачиваний:
13
Добавлен:
22.02.2020
Размер:
182.78 Кб
Скачать

Наследование

важный механизм объектно-ориентированного подхода, позволяющий расширить и/или изменить структуру уже существующего (родительского) класса, путём написания нового класса (потомка), который полностью наследует все свойства и методы и, плюс, добавляет что-то своё. Далее можно начинать создавать и использовать в программе новые объекты с расширенными возможностями.

Типы наследования

Простое наследование

Класс, от которого произошло наследование, называется базовым или родительским. Классы, которые произошли от базового, называются потомкаминаследниками или производными классами.

Множественное наследование

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости.

  1. Компоненты ОО подхода к проектированию и их определение.

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

Успех ОО методологии определяется ее преимуществами в сравнении с традиционной структурной, среди которых особо выделяются следующие.

Повторное использование (reuse).Разрабатываемые в рамках проекта классы обычно отражают типовые проектные решения, поэтому их использование возможно и в других проектах. ОО методология позволяет накапливать опыт проектных решений в виде библиотек классов и использовать его на основе механизма наследования. При наличии развитых библиотек классов проектирование и программирование новых приложений будет в основном сводиться к сборке системы из готовых фрагментов.

Упрощение внесения изменений.При ОО подходе изменения в проекте имеют локальный характер. В тех случаях, когда изменение носит характер уточнения, детализации, вводятся новые классы, наследующие поведение ранее созданных. Наследование позволяет не только не пересматривать ранее созданные объекты и классы, но даже обойтись без их повторной трансляции. В более сложных случаях, когда меняются методы, определяющие интерфейс классов, изменения в проекте будут более значительными, но и тогда они будут локализованы, затрагивая лишь классы, использующие эти методы.

Распараллеливание работ.. Программирование и тестирование отдельных компонент системы возможно до завершения проектирования целевой программной системы, что экономит время разработки.

ОО жизненный цикл

ОО жизненный цикл программных систем содержит несколько этапов, но в нем нет строгой последовательности их выполнения. Такой принцип, называемый возвратным, отражает итеративный по своей природе характер процесса разработки.

Начальным этапом является ОО анализ. На его ранней стадии определяются требования к системе. Затем осуществляется анализ предметной области. Здесь определяются основные классы и объекты, которые составляют словарь предметной области.

На этапе ОО проектирования детализируется представление классов и объектов, полученных на этапе анализа. Определяются структуры данных, методы, отношения между классами, разрабатываются сценарии взаимодействия объектов. При проектировании системы могут вводиться новые классы и объекты, если это потребуется для решения поставленных проблем. Результатом проектирования должна быть детальная спецификация объектов, классов и отношений, достаточная для их программирования.

Программирование, тестирование и сборка системы рассматриваются как единый этап, называемый эволюцией системы. При ОО подходе имеется возможность быстрого создания прототипов проектируемой системы, постепенное развитие которых приводит к конечному результату. На этом этапе также возможно введение новых классов, изменение структур данных, добавление новых методов. Следует заметить, что программирование и тестирование отдельных компонент системы возможно до завершения проектирования, что экономит время разработки.

На этапе модификации системы активно используются свойства классов и объектов, которые позволяют легко локализовать изменения, свести к минимуму переработку программ за счет использования механизма наследования.

  1. Определение основных свойств ОО языка программирования.

 Непременным свойством истинного ОО-языка является инкапсуляция, что означает "закупоренность" механизма того или иного явления в Объектах. Вообще, инкапсуляция основана на области видимости (Scope) внутренних переменных Класса. Таким образом программист зачастую использует объекты, созданные другими программистами, и абсолютно не задумывается, как все это устроено, он просто доверяет "производителю объекта" и всецело занят лишь решением задачи, поставленной конкретно ему

Второй "кит" - наследование. Что это значит? Это значит, что Объекты (Классы, Коллекции) могут перенимать некоторые свойства у своих прародителей. Как - это зависит от того языка, на котором пишется программа. Однако в любом случае картина та же: это приводит к повторному использованию уже написанного однажды кода. Наследование-то по определению заставляет что-то у кого-то наследовать, значит, можно создать свое текстовое поле на основе уже существующего класса TextBox (в Visual Basic), причем новый Класс (назовем его EnhancedBox) наделен всем тем, чем располагает его стандартный родитель, плюс новыми свойствами, определяемыми его создателем. Никуда не денутся свойства Font, Alignment, Multiline, - если их специально не "ампутировать". На основе наследования, - пусть даже искусственного, - в Visual Basic выросла и техника Cубклассинга (Subclassing), при которой компоненты наделяются новыми свойствами. Чаще термин употребляется применительно к элементам управления. На рисунке показан фрагмент работы с ClassBuilder. В текстовое поле необходимо ввести имя класса-родителя, или же оставить Based on: (New class). Я выбрал первичный класс cLink, поэтому новый Класс cLoadedLink унаследовал все его "аксессуары".

Третий "кит" ООП - полиморфизм. Вообще, это уже из области искусственного интеллекта J. В данном случае речь идет о той роскоши, за которую стоит выдерживать и немногие издержки ООП (однако же выигрыш очевиден и бесспорен!). Объекты, располагающие одноименными методами или свойствами, могут с легкостью управляться в ходе программы, независимо от того, что эти одноименные свойства и методы выполняют абсолютно разные действия, в отношении абсолютно разных классов, да и устроены по-разному. Например, возьмем свойство Font, широко распространенное во многих компонентах:

  1. Поля объектов и методы.

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

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

Методы — это процедуры и функции, описанные внутри класса и предназначенные для операций над его полями. В состав класса входит указатель на специальную таблицу, где содержится вся информация, нужная для вызова методов. От обычных процедур и функций методы отличаются тем, что им при вызове передается указатель на тот объект, который их вызвал. Поэтому обрабатываться будут поля именно того объекта, который вызвал метод

  1. Абстракция и наследование.

Абстракция — в объектно-ориентированном программировании это придание объекту характеристик, которые отличают его от всех других объектов, четко определяя его концептуальные границы. Основная идея состоит в том, чтобы отделить способ использования составных объектов данных от деталей их реализации в виде более простых объектов, подобно тому, как функциональная абстракция разделяет способ использования функции и деталей её реализации в терминах более примитивных функций, таким образом, данные обрабатываются функцией высокого уровня с помощью вызова функций низкого уровня. Такой подход является основой объектно-ориентированного программирования. Это позволяет работать с объектами, не вдаваясь в особенности их реализации. В каждом конкретном случае применяется тот или иной подход: инкапсуляция, полиморфизм или наследование. Например, при необходимости обратиться к скрытым данным объекта, следует воспользоваться инкапсуляцией, создав, так называемую, функцию доступа или свойство. Абстракция данных — популярная и в общем неверно определяемая техника программирования. Фундаментальная идея состоит в разделении несущественных деталей реализации подпрограммы и характеристик существенных для корректного ее использования. Такое разделение может быть выражено через специальный «интерфейс», сосредотачивающий описание всех возможных применений программы. С точки зрения теории множеств, процесс представляет собой организацию для группы подмножеств своего множества.

Наследование — механизм объектно-ориентированного программирования, позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.

Простое наследование Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза». Множественное наследование При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML. Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя. Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе. Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

  1. Инкапсуляция; переопределение методов.

Инкапсуля́ция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (что у него внутри?), а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public. Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal. Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием). Сокрытие реализации целесообразно применять в следующих случаях: предельная локализация изменений при необходимости таких изменений, прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.

Переопределение метода (англ. Method overriding) в объектно-ориентированном программировании — одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те жепараметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса[1]. Версия метода, которая будет исполнятся, определяется объектом, используемым для его вызова. Если вызов метода происходит от объекта родительского класса, то выполняется версия метода родительского класса, если же объект подкласса вызывает метод, то выполняется версия дочернего класса[2]. Некоторые языки программирования позволяют программисту защищать методы от переопределения.

  1. Виртуальные методы и полиморфизм. Раннее и позднее связывание.