MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

MATLAB

В.Г.Потемкин "Введение в Matlab" (v 5.3)
Глава 8. Объектно-ориентированное программирование

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

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

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

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

Существует два вида наследования:

  • простое наследование, когда дочерний объект наследует характеристики от одного родительского класса;
  • множественное наследование, когда дочерний объект наследует характеристики более чем одного родительского класса.

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

Функция конструктора для класса, который наследует поведение другого класса, имеет две специальных характеристики:

  • она обычно вызывает функцию конструктора родительского класса, чтобы создать “наследованные” поля;
  • вызов функции такого класса несколько отличается от стандартного, поскольку учитывает как новый, так и родительский класс.

Примеры простого наследования представлены объектами ППП Control System Toolbox, используемыми для решения задач анализа линейных стационарных систем (Linear, Time-Invariant systems - LTI). Родительский класс так и называется lti. Имеются три дочерних класса, или подкласса, которые соответствуют трем различным представлениям LTI-систем:.

  • tf-- Передаточная функция (Transfer function)
  • zpk-- Нули-полюса-коэффициент передачи (Zero, pole, gain)
  • ss-- Пространство состояний (State space)

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

Оператор создания объекта в классе lti

               L = lti(1, 1)

создает скелет LTI-объекта с нулевым тактом дискретности и пустыми именами входов и выходов.

Оператор вида

              T = tf(1,[1 0 -2 -5])

создает объект в классе tf, который представляет собой непрерывную передаточную функцию

           Transfer function:

                          1
                  -------------
                  s^3 - 2 s - 5

Более полно объект T характеризуется четырьмя полями:

  • T.num -- Поле вектора числителя, 1
  • T.den -- Поле вектора знаменателя, [1 0 -2 -5]
  • T.variable -- Поле переменной 's'
  • T.lti -- Поле, наследованное от lti-класса

Для объекта tf поле lti наследовано от его родителя LTI-объекта. В данном случае оно совпадает со скелетом L.

Если для ППП Control System Toolbox переопределить функции set и get, то их можно использовать для анализа свойств объекта.

Пример:

         get(T)
                num = {[0 0 0 1]}
                den = {[1 0 -2 -5]}
                Variable = 's'
                Ts = 0
                Td = 0
               InputName = {''}
                OutputName = {''}
                Notes = {}

                UserData = []

Диаграмма на рис. 8.3 иллюстрирует соотношения наследования

ris803.gif (4992 bytes)

Рис. 8.3.

Функции S = ss(T) и Z = zpk(T) преобразовывают представление в виде передаточной функции в другие представления, сохраняя общее поле Iti-объекта для всех трех представлений:

                        S=ss(T)

a =

x1 x2 x3
x1 0 1.00000 1.25000
x2 2.00000 0 0
x3 0 2.00000 0

 

b =

u1
x1 0.50000
x2 0
x3 0

 

c =

x1 x2 x3
y1 0 0 0.50000

 

d =

u1
y1 0

Continuous-time system.

           get(S)
               a = [3x3 double]
               b = [3x1 double]
               c = [0 0 0.5]
               d = 0
               e = [ ]
               StateName = {3x1 cell}
               Ts = 0
               Td = 0
               InputName = {''}
               OutputName = {''}
               Notes = {}
               UserData = [ ]
            Z = zpk(T)
            Zero/pole/gain:
                                  1
            --------------------------------
            (s-2.095) (s^2 + 2.095s + 2.387)
           get(Z)
                z = {[0x1 double]}
                p = {1x1 cell}
                k = 1
                Variable = 's'
                Ts = 0
                Td = 0
                InputName = {''}
                OutputName = {''}
                Notes = {}
                UserData = [ ]

Механизм наследования реализуется в функциях конструктора дочернего класса. Например, конструктор класса tf включает оператор

          L = lti(Ny, Nu, Ts)

для создания lti-объекта с соответствующими параметрами. Тогда tf-объект можно создать, используя встроенный оператор class

          sys = class(sys, 'tf', L)

Такое использование оператора class с тремя аргументами позволяет присвоить объекту соответствующую метку класса и указать, что наследуется от родительского объекта.

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

Множественное наследование. В случае множественного наследования класс наследует атрибуты от более, чем одного родительского класса. Дочерний объект наследует поля, как поля родительских классов, так и поля собственной структуры.

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

            obj = class(structure, 'class_name', parent1, parent2,...)

Можно объединять любое количество аргументов родительского класса в соответствии со списком входных аргументов.

Схема на рис. 8.4 показывает, как гипотетический объект класса eco мог бы наследовать поля от двух родительских классов weather и plant.

Множественные родительские классы могут присоединять методы с одинаковыми названиями. В этом случае MATLAB использует метод, связанный с родителем, который появляется первым при обращении к функции класса в конструкторе.

Агрегирование объектов. В дополнение к наследованию система MATLAB поддерживает соединение частей в целое, или агрегирование. То есть один объект может включать другой объект в качестве одного из полей структуры. Объект класса rational может использовать два объекта из класса polynom, например, для задания числителя и знаменателя передаточной функции. Поскольку доступ к полям структуры возможен только изнутри метода, то вызов метода для включенного объекта возможен только изнутри метода для внешнего объекта.

ris804a.gif (2894 bytes)

ris804b.gif (4255 bytes)

Рис. 8.4.

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

 


Поиск по сайту:

Система Orphus

Яндекс.Метрика