Главная страница
Навигация по странице:

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

  • 34. Объектно-ориентированное программирование. Множественное наследование

  • 35. Объектно-ориентированное программирование. Ограниченная универсальность

  • 33. Объектноориентированное программирование. Наследование


    Скачать 18.01 Kb.
    Название33. Объектноориентированное программирование. Наследование
    Дата20.12.2022
    Размер18.01 Kb.
    Формат файлаdocx
    Имя файла33-36.docx
    ТипДокументы
    #854611

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

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

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

    34. Объектно-ориентированное программирование.

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

    При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

    Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. 
    Мы также можем наследовать класс от уже наследуемого. Это называется многоуровневым наследованием. Оно может иметь сколько угодно уровней.

    В многоуровневом наследовании свойства родительского класса и наследуемого от него класса передаются новому наследуемому классу.

    35. Объектно-ориентированное программирование. Ограниченная универсальность 

    Универсальность - это механизм определения параметризованных шаблонов модулей (module patterns), параметры которых представляют собой типы. Это средство является прямым ответом на требование Изменчивости Типов. Оно устраняет необходимость использования многих модулей.

    Неограниченная универсальность частично ослабляет жесткий статический контроль типов. Тривиальный пример - подпрограмма обмена значений двух переменных.

    Полиморфные структуры данных не являются единственным способом комбинирования универсальности и наследования. Другая важная техника следует из исследования вопроса:  что можно делать с сущностями или выражениями универсального типа?

    В универсальном классе, таком как  LIST[G] или  ARRAY[G], в тексте этого класса, как правило, появляется объявление  x: G. Какие операции применимы к  G?

    Прежнее обсуждение может подсказать ответ. Так как  G — просто держатель места для любого типа, который будет задан фактическим родовым параметром ( VEHICLE, например), применимыми операциями могут быть только операции доступные любому типу, следовательно — операции, введенные в классе  ANY. Так что можно использовать вызовы: x.cloned, x.isequal(y) и так далее, но нельзя использовать компоненты, отсутствующие у  ANY.

    Что если требуется больше операций? Рассмотрим случай "сортирующего" класса с методом  sort, сортирующим элементы структуры данных, — массива, списка, например, списка целых. Естественно, хочется иметь механизм, работающий для многих  типов, а не только для целых. Универсальность кажется подходящим механизмом для реализации поставленной задачи.

    Алгоритмы сортировки — это обширная область информатики, она не является предметом нашего изучения, хотя топологическая сортировка была рассмотрена достаточно подробно. Но нет необходимости в разборе различных методов сортировки для осознания того факта, что для сортировки, предположим, массива, понадобится выполнять следующие операторы:

    x : = t[i] ; y := t[j]

    if x < y then

    — Обмен элементов, находящихся в позициях i и j

    a [i] := y ; a [j] := x

    end

    Сочетание универсальности и наследования дает полезную технику - ограниченную универсальность (constrained genericity). Теперь вы можете определить класс с родовым параметром, представляющим не произвольный тип, а лишь тип, являющийся потомком некоторого класса.

    Родовой класс SORTABLE_LIST описывает списки; он содержит компонент sort, сортирующий элементы списка в соответствии с заданным отношением порядка. Параметр этого родового класса задает тип элементов списка. Но этот тип не может быть произвольным: он должен поддерживать отношение порядка. Фактический родовой параметр должен быть потомком библиотечного класса COMPARABLE, описывающего объекты, снабженные отношением порядка. Ограниченная универсальность позволяет объявить наш родовой класс следующим образом: SORTABLE_LIST [G -" COMPARABLE] .

    Механизм универсальности должен поддерживать форму ограниченной универсальности.


    написать администратору сайта