Презентация на тему форм наследования в ООП
Описание файла
PDF-файл из архива "Презентация на тему форм наследования в ООП", который расположен в категории "". Всё это находится в предмете "проектирование программного обеспечения автоматизированных систем" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "проектирование по автоматизированных систем" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Формы наследованияПонятие наследованияФормы наследованияПравильные формы наследования1Понятие наследованияНаследование − это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) илидругих (множественное наследование) классовНаличие механизма наследования отличает объектно-ориентированные языки от объектных2Понятие родительского и дочернегоклассовКласс, структура и поведение которого наследуется,называется суперклассом, надклассом, базовым илиродительским классомКласс, производный от суперкласса, называетсяподклассом, производным или дочерним классомMyGraphicsPrimitive2D3MyLineродительскийклассдочерний классФормы наследованияВ подклассе структура и поведение исходногосуперкласса могут дополняться, переопределятьсяили ограничиватьсяИсходя из этого, можно выделить различные формы наследования4Формы наследования(1)Специализация(2) Спецификация(3) Обобщение(4) Расширение(5) Ограничение(6) Конструирование(7) Варьирование5(8) КомбинированиеСпециализацияДочерний класс является более конкретным, частным или специализированным случаем родительского классаДочерний класс удовлетворяет спецификациям родителя во всех существенных моментах, т.е.
егоможно использовать вместо родительского классаПоведение базового класса, в основном, переопределяется6Пример специализацииИмеется класс MyEllipse, который представляет собой эллипс и поддерживает следующие операции:7−MyEllipse(MyPoint, int, int) - инициализация при создании (конструктор)−setPos(MyPoint) - задание позиции на плоскости−move(int, int) - перемещение на заданноесмещение по горизонтали и вертикали−draw() - отрисовка самого себяПример специализацииКласс MyCircle, представляющий собой окружность,может быть порожден как специализация базовогокласса MyEllipse, т.к.
поддерживает те же операции,но переопределяет их реализациюКласс MySquare (квадрат) является специализациейкласса MyRectangle (прямоугольник)MyEllipseспециализация8MyCircleMyRectangleспециализацияMySquareСпецификацияРодительский класс описывает поведение, котороереализуется в дочернем классе, но оставлено нереализованным в родительскомВ таких случаях родительский класс называют абстрактно-специфицированным классом9Пример спецификацииИмеются классы плоскостных графических примитивов − MyLine, MyRectangle, MyTriangle и MyEllipseКлассы должны поддерживать единый набор операций:10−setPos(int, int) - задание позиции на плоскости−move(int, int) - перемещение на заданноесмещение по горизонтали и вертикали−draw() - отрисовка самого себяПример спецификацииЧтобы гарантировать наличие указанных операций,нужно определить обобщенный графический примитив MyGraphicsPrimitive2D, который будет содержать в себе эти операцииНи одна из указанных операций не будет реализована в этом классе, т.к.
их реализация зависит оттипа примитиваКласс MyGraphicsPrimitive2D является абстрактными от него нельзя порождать экземпляры11Пример спецификацииMyGraphicsPrimitive2DспецификацияMyEllipse12MyRectangleMyLineОбобщениеДочерний класс модифицирует и переопределяетнекоторые методы родительского класса с цельюполучения объекта более общей категорииДанная форма наследования противоположна специализации и обычно применяется, когда построение происходит на основе существующих классов,которые мы не хотим или не можем изменять13Пример обобщенияОт класса «список» MyList, который реализует список с возможностью доступа к его голове и хвосту,наследуется класс «контейнер» MyContainer, который реализует произвольный доступ к элементамВ дочернем классе по сравнению с родительскимимеются методы добавления элементов в начало,конец и произвольную позицию контейнера и т.д.MyListобобщение14MyContainerРасширениеДочерний класс добавляет новые функциональныевозможности к родительскому классу, но не меняетнаследуемое поведениеВ отличие от обобщения или специализации прирасширении дочерний класс не переопределяет ниодного метода базового класса, а добавленные методы слабо связаны с существующими методами родителя15Пример расширенияНа основе обобщенного графического примитиваMyGraphicsPrimitive2D в двумерной плоскостиможноопределитьпроизводныйклассMyAreaPrimitive2D, который определяет все примитивы, имеющие площадьПо сравнению с базовым классом в классMyAreaPrimitive2D добавлен метод area(), которыйвозвращает площадь плоскостной фигурыMyGraphicsPrimitive2Dрасширение16MyAreaPrimitive2DОграничениеДочерний класс ограничивает использование некоторых методов родительского классаТак же, как и при обобщении, порождение для ограничения чаще всего возникает, когда, программистстроит класс на основе существующей иерархииклассов, которая не должна или не может быть изменена17Пример ограниченияИмеется класс MyDeque, представляющий собойдвустороннюю очередь (элементы добавляются иизвлекаются с любого конца)На основе классаMyDeque порождается классMyStack, представляющий собой стек, в котором добавление и извлечение элементов осуществляетсятолько из одного конца18Пример ограниченияКласс MyStack должен скрыть методы добавления иизвлечения элементов из другого конца очередиMyDequeограничениеMyStack19Пример ограниченияИмеется класс MyEllipse, который представляет собой эллипс и поддерживает следующие операции:20−MyEllipse(MyPoint, int, int) - инициализация при создании (конструктор)−setPos(MyPoint) - задание позиции на плоскости−setRadius(int, int) - задание радиусов−draw() - отрисовка самого себяПример ограниченияКласс MyCircle, представляющий собой окружность,должен ограничить базовый класс MyEllipse, т.к.
длянего не применим метод setRadius(int, int)MyEllipseограничениеMyCircle21КонструированиеДочерний класс использует методы, предопределяемые родительским классомМежду дочерним и родительским классами отсутствует отношение «is-a» или «быть экземпляром»,т.е. дочерний класс не является более специализированной формой родительского класса22КонструированиеОбычно для реализации такой формы наследованияиспользуется механизм закрытого наследованияДочерний класс часто изменяет не только именаметодов базового класса, но и аргументы23Пример конструированияКласс олимпийских колец MyOlimpicRings наследуется от класса MyCircleКласс MyOlimpicRings для собственной отрисовкииспользует операции базового класса move(int,int) и draw()MyCircleконструированиеMyOlimpicRings24ВарьированиеВарьирование наблюдается, когда два класса имеютсходную реализацию и находятся примерно на одном уровне иерархии, т.е.
являются частными случаями более общего понятия25Пример варьированияИмеется класс MySlider, который представляет собой элемент управления «бегунок»На его основе можно породить класс MyDial, представляющий собой «циферблат». Этот класс вомногом схож с MySlider, т.к. по своей сути является«круговым бегунком»MySliderварьированиеMyDial26Пример избавления от варьированияОднако лучшей альтернативой является выделениеобщего кода в абстрактный класс, например,MyAbstractSlider, и порождение обоих классов отэтого общего предкаТакой путь может быть недоступен при доработкеуже существующего классаMyAbstractSliderспецификация27MySliderMyDialКомбинированиеДочерний класс наследует черты более чем одногородительского классаДля комбинирования классов используется механизм множественного наследования28Пример комбинированияИмеется класс MyWidget, который обеспечивает базовое поведение всех элементов управленияИмеется класс MyTimer, представляющий собойтаймер29Пример комбинированияДля реализации виджета «секундомер» создаетсякласс MyStopWatch, который наследует поведениесразу двух базовых классовПри таком подходе класс MyStopWatch можно использовать и как элемент управления, и как таймер("играет" сразу две роли)MyWidgetMyTimerкомбинирование30MyStopWatchПравильные формы наследования(подход "is-a")К правильным формам относятся только те, в которых между дочерним и родительским классом возникает отношение "is-a" или "быть экземпляром"или "обобщение−специализация", т.е.
дочернийкласс является частным случаем своего предка"Лакмусовая бумажка" наследования − это обратнаяпроверка: если B не есть A, то B не стоит производить от A31Примеры правильных формнаследования (подход "is-a")Утверждение «прямоугольник не есть частный случай квадрата» верно, поэтому класс MyRectangle недолжен наследоваться от MySquareУтверждение «окружность не есть частный случайэллипса» неверно, поэтому класс MyCircle долженнаследоваться от MyEllipseУтверждение «олимпийские кольца не есть частныйслучайокружности»верно,поэтомуклассMyOlimpicRings не должен наследоваться отMyCircle32Правильные формы наследования(подход "is-a")(1)Специализация(2) Спецификация(3) Расширение (в большинстве случаев)(4) Ограничение (иногда)(5) Комбинирование (иногда)33Правильные формы наследования(подход "тип−подтип")Форму наследования можно считать правильной,если между суперклассом и подклассом имеется отношение "тип−подтип" ,т.е.
выполняется принципподстановкиПринцип подстановки: говорят, что тип B являетсяподтипом A, если мы можем в любой ситуацииподставить экземпляр класса B вместо экземпляракласса A без каких-либо видимых изменений в пове34 денииПравильные формы наследования(подход "тип−подтип")Для того чтобы класс B был подтипом класса A, ондолжен иметь схожее поведение с классом A во всехсущественных моментахСхожее поведение означает, что класс B долженподдерживать тот же набор методов, что и класс A,при этом семантика реализуемых методов должнабыть сопоставима35Примеры правильных форм наследования(подход "тип−подтип")В любом месте программы вместо классаMyGraphicsPrimitive2D, представляющего собойобобщенный графический примитив на плоскости,можноподставитьклассыMyLine(линия),MyRectangle (прямоугольник) и MyEllipse (эллипс)MyGraphicsPrimitive2Dтип-подтипMyEllipse36MyRectangleMyLineПравильные формы наследования(подход "тип−подтип")(1)Специализация(2) Спецификация(3) Обобщение(4) Расширение(5) Конструирование (очень редко)(6) Варьирование (иногда)(7) Комбинирование37"Абсолютно" правильные формынаследования(1)Специализация(2) Спецификация(3) Расширение - если производный класс естьчастный случай базового(4) Комбинирование - если производный класс естьчастный случай базовых и является подтипомбазовых типов38"Допустимые" формы наследованияЕсли используется готовая библиотека классов, тодопустимы следующие формы наследования:(1)Обобщение(2) Ограничение(3) Варьирование(4) Комбинирование - если производный класс неявляется частным случаем базовых39"Недопустимые" формы наследования• Конструирование всегда является недопустимойформой наследования и всегда может быть заменено на отношение агрегации или использованиямежду классами40Пример различных форм наследованияMyGraphicsPrimitive2DрасширениеспецификацияMyAreaPrimitive2DспецификацияMyEllipseспецификацияMyRectangleспециализацияMyCircle41специализацияMySquareMyLine.