дочернего класса.
Существует два вида наследования:
•простое наследование - когда дочерний объект наследует характеристики от одного родительского класса;
•множественное наследование, когда дочерний объект наследует характеристики более чем одного родительского класса;
Простое наследование. В случае простого наследования класс, который наследует атрибуты другого класса, добавляет собственные атрибуты. Наследование подразумевает, что объекты, принадлежащие к дочернему классу, имеют те же поля, что и объекты родительского класса, и как правило, дополнительные собственные поля. Именно поэтому методы родительского класса могут применяться к объектам дочернего класса. (Т.е. в таком случае говорят, сто проявляется свой свойство полиморфизма). Методы дочернего класса, однако, не могут применяться к объектам родительского класса.
Функция конструктора для класса, который наследует поведение другого класса имеют две специальные характеристики:
•она обычно вызывает функцию конструктора родительского класса, чтобы создавать "наследованные" поля.
•вызов функции такого класса несколько отличается от стандартного, поскольку учитывает как новый, так и родительский класс.
Пример: (Примером простого наследования могут быть объекты класса,
используемого для решения задач анализа лин. cтационарных систем) Класс - LTI; и дочерние классы от него:
If- передаточная функция (Transfer function);
zpk - нули - полюса - коэффициент передачи (Zero, pole, gain); ss - пространство состояний (State space),
Объект LTI включает информацию, которая не зависит от частного вида системы (непрерывная или дискретная), а также от имен входов и выходов. Дочерние объекты зависят от модели представления.
Объект класса tf характеризуется векторами коэффициентов числителя и знаменателя рациональной передаточной функции.
Объект класса zpk характеризуется векторами, содержащими нули, полюсы и коэффициент передачи системы.
Объект класса ss определяется четверкой матриц, дающих описание динамической системы в пространстве состояний. Объекты класса ss позволяют описать рассматриваемую систему систему в матричном виде, (в виде совокупности матриц А, В, С, D, Е)
Для создания объекта в классе LTI
L=Lti(1,1)
(создает скелет LTI-объекта с нулевым тактом дискретности и пустыми именами входов и выходов)
103
T=tf(1,[1 0-2-5])
(создает объект в классе tf, который представляет собой непрерывную передаточную функцию Т=1/(s3-2s-5))
Более полно объект Т характеризуется четырьмя полями: Т. num - поле вектора числителя, 1:
Т. den - поле вектора знаменателя, [1 0-2-5]: Т. variable - поле переменной s;
Т. Iti - поле, наследованное от Lti-класса. (от объекта LTI класса, в данном случае оно совпа-
дает со скелетом L).
Если теперь в Warkspace набрать get(T) то получим значения всех свойств объекта Т:
num =([000 1]}
den=j[1 0-2-5]}
Variable = 's' или: 'q','n','n-1' Ts=0
Td=0
InputName = {"} OutputName = {"} Notes ={}
UserData = []
(где num - полином числителя передаточной функции, den - полином знаменателя , Variable - аргумент, Ts - определяет непрерывность или дискретность рассматриваемой модели, Td - шаг дискретизации, InputName - название входа системы, OutputName - название выхода системы, Notes – пояснения).
Рис.5.11. Схема соотношения наследования.
104
(создание объектов классов ss и zpk осуществляет преобразование представления в виде ПФ и в виде системы состояний)
S = ss(T) Z=zpk(T)
Если теперь в Warkspace набрать get(S) и get(Z) то получим значения всех свойств объекта S и Z:
get(S)
а = [3х3 double] b= [3х1 double]
с=[0 0 0.5] d=0
е=[]
Variable = 's' StateName = {3х1 cell} Ts=0
Td=0 InputName = {"}
OutputName = {"}
Notes = {} UserData = [ ] get(Z)
z= {[0х1 double]} p={ 1х1 cell} k=1
Variable ='s' Td=0
Te=0 InputName = {"}
OutputName = {"} Notes ={} UserData = [ ]
(т. е. видно, что помимо своей структуры класса имеется ещѐ структура класса прародителя LTI)
Рис.5.12 Схема иерархии классов LTI, TF, SS, ZPK
105
Механизм наследования реализуется в функциях конструктора дочернего класса.
Пример: конструктор класса tf включает оператор
L=LTI(Ny,Nu,Ts)
(для создания lti-объекта с соответствующими параметрами, где Ny - размерность выхода системы; Nu - размерность входа системы)
Тогда tf-объект можно создать, используя встроенный оператор : sys = class (Structure,'tf', L)
использование оператора class с тремя аргументами позволяет присвоить объекту соответствующую метку класса и указать, что наследуется от родительского объекта. Причѐм структура объекта задаѐтся параметром Structure, в следующем виде:
Structure = struct ('num',[ ], 'den',[ ], 'variable',");
Наследование может быть многоуровневым, то есть дочерний объект может содержать поля как родительских объектов, так и объектов более старших поколений (в этом случае родительский объект может вызывать прародительские методы, а дочерний - как родительские, так и прародительские).
Множественное наследование. В случае множественного наследования класс наследует атрибуты от более чем одного родительского класса. Дочерний объект наследует поля как родительских классов, так и собственной структуры. Множественное наследование может объединять более одного поколения.
Множественное наследование полей прародительских объектов реализуется в конструкторах путем вызова функции class с более чем тремя аргументами:
obj = class (Structure, 'class_name', parent 1, parent2, ...) (где
Structure - описание структуры создаваемого объекта class name - имя класса объекта
parent1 - имя класса 1-го прародителя parent2 - имя 2-го прародителя)
Можно объединять любое количество аргументов родительского класса в соответствии со списком входных аргументов.
Множественные родительские классы могут присоединять методы с одинаковыми названиями. В этом случае MATLAB использует метод, связанный с родителем, который появляется первым при обращении к функции (т. e. находиться первым в списке параметров функции class)
Агрегирование объектов. В дополнение к наследованию система MATLAB поддерживает соединение частей в целое, или агрегирование. То есть один объект может включать другой объект в качестве одного из полей структуры. Поскольку доступ к полям структуры возможен только изнутри метода, то вызов метода для включенного объекта возможен только изнутри метода для внешнего объекта.
106
Краткое описание функций и команд
СLASS - Определить класс объекта или создать объект
Синтаксис: obj=class('<имя_класса>') obj = class(S, '<имя_класса>')
obj = class(S, '<имя_класса>', <родитель1>, <родитель2> ...)
Описание:
функция obj=class('имя_класса^) возвращает строку, содержащую имя класса, соответствующего таблице 1:
Функция obj = class(S,'<имя_класса>') создает объект класса с указанным именем, используя структуру S в качестве шаблона. Где под <имя_класса> понимается М- функция с именем имя_класса.m, размещенная в каталоге класса @имя_класса.
Функция obj=class(S, '<имя_класса>', <родителъ1>, <родитель2>...) создает объ-
ект класса с указанным именем, используя структуру S в качестве шаблона, а обеспечивает что вновь создаваемый объект наследует методы и поля родительских объектов, указанных в качестве аргументов.
ISA - Определить принадлежность объекта к данному классу
Синтаксис:
К= class (obj,'<имя_класса>')
Описание:
Функция К = class(obj,'<имя_класса>'} возвращает логическое TRUE (1), если объект принадлежит данному классу, и логическое FALSE (0) - в противном случае.
Аргумент <имя_класса> - это либо имя класса, определѐнного пользователем, либо имя одного предопределѐнного классов системы
MATHLAB.
Пример:
isa (rand (3, 4), 'double') ans= 1
ISOBJECT - Выявление объекта некоторого класса
Синтаксис:
k = isobject(A)
Описание:
Функция k = isobject (А) возвращает логическое TRUE (1), если А - объект некоторого класса, и логическое FALSE (0) - в противном случае.
107