Процедура, когда объекты одного
класса приобретают свойства объектов другого
класса или классов, называется процессом
наследования. Если некоторый объект (дочерний)
наследует свойства другого (родителя), дочерний
объект включает все поля родительского объекта и
может вызывать соответствующие методы. Наследование
- главное свойство объектно-ориентированного
программирования. Оно позволяет многократно
применять программы, разработанные для
родительских объектов, к дочерним. Методы
родительского класса имеют доступ только к тем
полям, которые унаследованы от родительского
класса, но не к полям дочернего класса.
Существует два вида наследования:
- простое наследование, когда дочерний объект
наследует характеристики от одного
родительского класса;
- множественное наследование, когда дочерний
объект наследует характеристики более чем
одного родительского класса.
Простое наследование. В случае
простого наследования класс, который наследует
атрибуты другого класса и добавляет собственные
атрибуты. Наследование подразумевает, что
объекты, принадлежащие к дочернему классу, имеют
те же поля, что и объекты родительского класса, и
как правило, дополнительные собственные поля.
Именно поэтому методы родительского класса
могут применяться к объектам дочернего класса.
Методы дочернего класса однако не могут
применяться к объектам родительского класса.
Функция конструктора для класса, который
наследует поведение другого класса, имеет две
специальных характеристики:
- она обычно вызывает функцию конструктора
родительского класса, чтобы создать
“наследованные” поля;
- вызов функции такого класса несколько
отличается от стандартного, поскольку учитывает
как новый, так и родительский класс.
Примеры простого наследования представлены
объектами ППП 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 иллюстрирует соотношения
наследования
Рис. 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 |
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, например, для задания числителя и
знаменателя передаточной функции. Поскольку
доступ к полям структуры возможен только изнутри
метода, то вызов метода для включенного объекта
возможен только изнутри метода для внешнего
объекта.
Рис. 8.4.
|