- •Объектно-ориентированная модель проектирования
- •Объекты и классы
- •Вызов методов
- •Переопределение классов
- •Иерархия объектов. Индексация объектов
- •Индексация объектов.
- •Наследование
- •Создание классов с помощью classdef
- •Описание атрибутов свойств
- •Описание атрибутов методов
- •Описание атрибутов событий
Лекция 8
Методы программирования классов в MATLAB.
Основные принципы объектно-ориентированной технологии программирования. Классификация объектов предметной области. Проектирование иерархии классов. Особенности программирования классов в MATLAB. Конструкторы. Перекрытие классов. Перекрытие операций. Примеры перекрытия арифметических операций в классах MATLAB и пользовательских классах. Наследование классов.
Основные принципы объектно-ориентированной технологии программирования
Введение новых типов данных и операций, определяемых пользователем, характеризует подход, известный как объектно-ориентированное программирование (ООП).
Объектно-ориентированное программирование – парадигма программирования, в которой основными концепциями являются понятия объектов и классов, реализованы механизмы абстракции, инкапсуляции, наследования и полиморфизма.
Объект – это сущность, которой можно посылать сообщения, используя её интерфейсные методы, и которая может на них реагировать, используя свои данные.
Класс является описываемой на языке программирования моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом.
Абстрагирование – это способ выделения набора значимых характеристик объекта, исключая из рассмотрения незначимые Соответственно, абстракция – это набор всех таких характеристик. Суть этого принципа в том, чтобы упростить работу со сложными объектами, состоящими из «меньших» объектов, избавившись от деталей реализации этих самых «меньших» объектов. Такой подход позволяет работать непосредственно с объектом, не вдаваясь в подробности из чего же он состоит и как работает.
Инкапсуляция – механизм языка программирования, который ограничивает доступ к составляющим объект компонентам (методам и переменным), делает их приватными, т.е. доступными только внутри объекта. Важно понимать, что к инкапсулированной переменной можно обратиться, когда пишешь реализацию класса, но при самом его использовании доступа не будет.
Наследование – механизм ООП, позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего базового класса. Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта (в ООП реализуется с помощью наследования классов и виртуальных функций). Класс-потомок наследует объявление методов класса-родителя, а реализация этих методов может быть другой, соответствующей специфике класса-потомка (в результате переопределения метода). Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке. Это называется поздним связыванием. Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка. Очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнения для экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.
Таким образом, объект – это экземпляр класса. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией. Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности – для этого требуется наличие наследования. Но даже наличие инкапсуляции и наследования не делает язык программирования в полной мере объектным с точки зрения ООП. Основные преимущества ООП проявляются только в том случае, когда в языке программирования реализован полиморфизм (т.е. возможность объектов с одинаковой спецификацией иметь различную реализацию).
Объектно-ориентированная модель проектирования
Неисчерпаемая сложность окружающего мира позволяет постигать себя с разной степенью подробности. Однозначно различаются объекты, их основные свойства (форма, материал), видимые взаимодействия. Чтобы прогнозировать поведение объектов в заданных условиях, нужно глубже изучить их свойства. Адекватная модель выделенной части мира должна копировать его объектную структуру как на уровне изучаемых взаимодействий, так и вглубь, до базовых свойств, определяющих поведение объектов. Требуется проработанная классификация объектов предметной области. (Предметная область – часть реального мира, рассматриваемая в пределах данного контекста. Под контекстом здесь может пониматься, например, область исследования или область, которая является объектом некоторой деятельности. Предметная область представляется множеством фрагментов, например, предприятие – цехами, дирекцией, бухгалтерией и т.д. Каждый фрагмент предметной области характеризуется множеством объектов и процессов, использующих объекты, а также множеством пользователей, характеризуемых различными взглядами на предметную область.)
В объектной технологии проектирования первоначально проектируется не изделие, а объектная иерархия его структурных элементов, способных взаимодействовать между собой. Основной механизм взаимодействия объектов – обмен сообщениями. Например, получив извне запрос о своей массе (рис. 1 a), объект самого верхнего уровня (конструкция) рассылает соответствующие сообщения объектам нижнего уровня (узлам), а те, в свою очередь, своим подчиненным объектам (деталям). Объектам самого нижнего уровня, у которых нет подчиненных объектов, ничего не остается, как произвести вычисление и возвратить его результаты в ответ на сообщение, а получивший этот результат источник последнего сообщения суммирует его с другими аналогичными результатами и возвращает выше, и т.д. вплоть до самого верхнего уровня. Более сложные сообщения могут побудить объекты к изменению своих параметров или состава. Например, получив требование увеличить дальность, объект Конструкция сначала пытается выполнить требование за счет изменения головной части (рис. 1 б). В случае неудачи обращается за советом к Экспертной системе, включает по ее рекомендации в состав конструкции донный газогенератор, в ходе взаимодействия определяется оптимальный газоприход и, если этого недостаточно для повышения дальности, рассматривается вариант с ракетным двигателем и т.д. Можно представить себе, что снаряд, представленный объектно-ориентированной моделью, получив сообщение с требованиями ТЗ, проектирует себя сам. Конечно, нужно еще представить себе, как такую объектную среду реализовать.
а б
Рис. 1. Обмен сообщениями в системе объектов
Этапы проектирования иерархии классов
Выделение базовой функциональности.
Проектирование общих базовых классов.
Добавление новой функциональности, создание нескольких ветвей иерархии.
Проектирование конкретных классов.
Пример. Иерархия классов "Геометрические фигуры"
Задача: разработать иерархию классов для хранения информации о геометрических объектах. Объекты должны поддерживать операции рисования, сдвига и клонирования (создание копии самого себя).
Ниже приведена диаграмма классов решающих эту задачу (рис. 2). Здесь в корне иерархии находится общий базовый класс, в котором заложена необходимая функциональность. Этот класс является абстрактным. Благодаря такой организации все классы-потомки будут иметь необходимые методы для рисования, сдвига и клонирования. Далее разделение геометрических фигур сделано по наличию у них площади: фигуры делятся на квадрируемые и не квадрируемые. Для работы с квадрируемыми фигурами введён класс QShape в котором предусмотрен метод getS()– получить площадь. Таким образом, при добавлении нового класса для квадрируемой фигуры в иерархию, он должен наследоваться от QShape; классы же фигур не имеющих площади наследуются непосредственно от AbstractShape.
Рис. 2. Иерархия классов "Геометрические фигуры"
