Modelica: Как назначить экземпляр типа Child в переменную типа Parent? - PullRequest
2 голосов
/ 24 февраля 2020

У меня есть классы:

class Parent 
end parent;

class Child 
  extends Parent; 
end Child;

В другом классе мне нужно объявить переменную типа Parent и инициализировать ее экземпляром типа Child; что-то похожее на выражение Java:

Parent p = new Child();

Как мне это сделать в Modelica?

Спасибо

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Понятие класса Modelica несопоставимо с понятием Java. Например, вы не создаете новые объекты, поэтому нет ничего похожего на

Parent p = new Child();

Вместо этого вы просто создаете экземпляр класса, записывая

Parent p;

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

См. Простой пример ниже. Example2 повторно объявляет cls в дочерний класс, поэтому мы получаем cls.c=2, когда мы имитируем его.

package Demo

  class Parent
    constant Real c=1;
  end Parent;

  class Child
    extends Parent(c=2);
  end Child;

  model Example1
    replaceable Parent cls;
  end Example1;

  model Example2
     extends Example1(redeclare Child cls);
  end Example2;

end Demo;

Таким образом, можно сказать, что объектная ориентация Modelica уменьшается до

  • наследование, используя extends
  • переопределение, используя redeclare
1 голос
/ 25 февраля 2020

Я не уверен, чего ты хочешь достичь. Я попытался выяснить это, учитывая этот другой вопрос , но он может помочь получить больше деталей о том, какие функции / поведение должен выполнять ваш родитель, ребенок и родитель p = new Child ().

Я собрал краткий обзор пары общих способов борьбы с наследованием. Но вы, возможно, ищете более конкретный c случай.

package Inheritance

import SI = Modelica.SIunits;

  connector PositivePin "Positive pin of an electrical component"
    SI.ElectricPotential v "Potential at the pin";
    flow SI.Current i "Current flowing into the pin";
  end PositivePin;

  partial model OnePort
    "Component with two electrical pins p and n and current i from p to n"
    SI.Voltage v "Voltage drop of the two pins (= p.v - n.v)";
    SI.Current i "Current flowing from pin p to pin n";
    Inheritance.PositivePin p "Positive electrical pin";
    Modelica.Electrical.Analog.Interfaces.NegativePin n "Negative electrical pin";
  equation 
    v = p.v - n.v;
    0 = p.i + n.i;
    i = p.i;
  end OnePort;

  model Resistor "Ideal linear electrical resistor"
    parameter SI.Resistance R = 1
      "Resistance at temperature T_ref";
    extends Inheritance.OnePort;
  equation 
    v = R*i;
  end Resistor;

  model Circuit
    Resistor r( R=10);
    Modelica.Electrical.Analog.Basic.Ground ground;
    Modelica.Electrical.Analog.Sources.ConstantVoltage constantVoltage(V=1);
  equation 
    connect(constantVoltage.n, ground.p);
    connect(constantVoltage.p, r.n);
    connect(r.p, ground.p);
  end Circuit;

end Inheritance;

, чтобы экземпляр p класса соединителя PositivePin

Inheritance.PositivePin p;

приводил переменные i, v в частичная модель OnePort (см. язык spe c для переменных потенциала и потока).

В классе модели Resistor

extends Inheritance.OnePort;

создаются переменные

  • i, v
  • pi, pv через экземпляр p класса PositivePin
  • ni, nv через экземпляр n класса NegativePin

а также уравнения

  • v = pv - nv;
  • 0 = pi + ni;
  • i = pi;

Наконец, в классе модели Circuit

Resistor r(R=10);

создает экземпляр класса Resistor с помощью так называемого модификатора, так что экземпляр r имеет значение сопротивления R = 10 вместо значения класса по умолчанию R = 1

...