Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posob_kom_mod_itog.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
7.42 Mб
Скачать

10.3. Полиморфизм

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

В ООМ объекты также могут быть формальными параметрами процедур и функций, а в системах с динамической структурой возможны присваивания переменным, являющимся указателями на блоки. Даже в системе со статической структурой локальные блоки и поведения можно рассматривать как указатели на экземпляры соответствующих классов, присваивание которым происходит один раз при создании блока-контейнера или модели в целом. Поэтому вопросы переопределения переменных и локальных блоков тесно связаны с полиморфизмом. Совместимость по наследованию в ООМ ничем не отличается от ООП.

Интерфейсом в ООП называется совокупность спецификаций процедур и функций (методов) без указания их реализации, т.е. совокупность абстрактных методов. Считается, что класс реализует (implements) некоторый интерфейс, если в определении класса имеются реализации для всех методов, указанных в определении интерфейса.

Иное положение в ООМ. Устройства Gen и Amp на рис. 10.1 взаимодействуют с внешним окружением через свои внешние переменные, значение которых изменяется непрерывно. В практике программирования объектам случается взаимодействовать через свои видимые переменные. При наличии в этих объектах параллельных нитей управления возникает проблема синхронизации, одним из решений которой является, например, property (свойства), обращения к которым автоматически переводятся компилятором в вызов соответствуюших методов. Для реальных физических систем эта проблема решается самой природой, а для модели правильная синхронизация обеспечивается исполняющей системой пакета моделирования.

Под интерфейсом в ООМ следует понимать некоторую совокупность видимых компонентов объекта, т.е. для блока это внешние переменные и видимые извне (pablic) процедуры и функции. Если блок содержит совокупность видимых компонент с теми же именами, что и в декларации интерфейса, и с совместимыми типами, то блок реализует этот интерфейс. Каждый блок неявно задает определенный интерфейс - совокупность всех своих внешних компонентов. «Чистым» интерфейсом является блок, у которого не определено поведение.

Тогда усилитель в схеме на рис. 10.1 можно заменить усилителем с насыщением, который совместим с ним по наследованию и по интерфейсу. Однако усилитель может быть также заменен и на интегратор, задаваемый уравнением , который тоже имеет вход Х, выход Y и параметр К того же вещественного типа и, следовательно, совместим с усилителем по интерфейсу, хотя и не имеет с ним ничего общего по наследованию.

В языке Modelica в дополнение к паре «суперкласс-подкласс» (superclass-subclass) очень активно используется другая пара – «супертип-подтип» (supertype-subtype), ориентированная на совместимость по интерфейсу.

Например, из класса CGain можно вывести производный класс (подкласс) CMulDiv (умножитель-делитель). Усилитель с насыщением в Modelica нельзя вывести из простого усилителя, поскольку карт состояния этот язык не поддерживает, а уравнения переопределять запрещает.

model CGain

parameter Real K = 1;

input Real X (start=0);

output Real Y;

equation

Y = K*X;

end CGain;

model CMulGiv

extends CGain;

output Real Z;

equation

Z= X/K;

end CMulGiv;

Новый класс CMulGiv наследует от своего суперкласса CGain вход, выход, параметр и одно уравнение, а также добавляет один выход и одно уравнение. Определим теперь класс CSaturation вне всякой связи с CGain:

model CSaturation

parameter Real K = 1;

parameter Real UpperLimit = 1;

parameter Real LowerLimit = - UpperLimit;

input Real X (start=0);

input Real Y;

protected

Real Xmin (start=LowerLimit/K);

Real Xmax (start=UpperLimit/K);

equation

Y = if X>Xmax then UpperLimit

else if X<Xmin then LowerLimit

else K*X;

end Csaturation;

CSaturation является подтипом класса CGain, а тот, в свою очередь, супертипом CSaturation, поскольку каждому public-элементу класса CGain соответствует совместимый по типу (в данном случае одного и того же типа) public -элемент CSaturation.

Для того чтобы в устройстве SineSource (см. рис. 10.1) простой усилитель можно было заменить на усилитель с насыщением, нужно этот блок параметризовать:

model CSineSource

output Real Y;

replaceable model Camp = CGain

protected

CsainGenerator Gen (Amplitude=2);

Camp Amp (K=0.6);

equation

connect(Gem.Y,Amp.X);

connect(Gem.Y,Y);

end CSineSource;

Далее нужно создать специальный класс CLimitedSineSource на основе СSineSource, переопределив параметризованный класс СAmp, и затем его использовать. Это можно сделать двумя способами:

model CLimitedSineSource

extends СSineSource (redeclare СSaturation CAmp);

end ClimitedSineSource;

model ClimitedSineSource=

СSineSource (redeclare model Camp=СSaturation);

Modelica разрешает переопределять локальные блоки посредством параметризации класса. Аналогичным способом разрешается переопределять и коннекторы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]