1

すべての派生クラスは、基本クラスからいくつかのデフォルトの方程式を継承する必要があります。デフォルトの方程式が派生クラスに対して有効でない場合は、それを再宣言する必要があります。以下のこのミニマルな例は、ややばかげています。

私は上記の目標を達成するための正しい軌道に乗っていますか?または、これをModelica言語で表現するためのより良い方法はありますか?

package Pkg

  partial class Equations
    Real x;
  end Equations;

  class DefaultEquations
    extends Equations;
    equation
      x = 0.0;
  end DefaultEquations;

  class Base
    replaceable class T = DefaultEquations;
    replaceable T equations extends Equations;
  end Base;

end Pkg;

model TestEquations

  import Pkg.*;

  class CustomEquation
    extends Equations;
    equation
      x = 3;
  end CustomEquation;

  class CustomizedClass
    extends Base(redeclare class T = CustomEquation);
  end CustomizedClass;

  CustomizedClass customized;

end TestEquations;
4

1 に答える 1

3

私があなたの目標を理解していれば、これを達成するための非常に簡単な方法があります。この代替案を検討してください。

package Pkg
  partial class Equations
    Real x;
  end Equations;

  class DefaultEquations
    extends Equations(x=0);
  end DefaultEquations;

  class Base
    replaceable class T = DefaultEquations;
    replaceable T equations extends Equations;
  end Base;
end Pkg;

model TestEquations
  import Pkg.*;

  class CustomEquation
    extends Equations(x=3);
  end CustomEquation;

  class CustomizedClass
    extends Base(redeclare class T = CustomEquation);
  end CustomizedClass;

  CustomizedClass customized;
end TestEquations;

ただし、すべての再宣言を削除する場合は、さらに単純化できます。

package Pkg
  class Equations
    Real x;
  end Equations;

  class Base
    Equations equations;
  end Base;
end Pkg;

model TestEquations
  import Pkg.*;

  class CustomizedClass
    extends Base(equations(x=3));
  end CustomizedClass;

  CustomizedClass customized;
end TestEquations;

...さらに、継承のすべてのレイヤーが必要ない場合は、次のようにします。

package Pkg
  class Equations
    Real x;
  end Equations;
end Pkg;

model TestEquations
  import Pkg.*;

  Equations equations(x=3);
end TestEquations;

これらの変更(x=3パーツ)は、パラメーターの場合と同じように変数に対しても機能します。したがって、任意の変数(変数宣言の後に表示される部分)の「初期化方程式」を取得してオーバーライドできます。このアプローチの制限は、一般的な方程式をオーバーライドできず、単一の変数を明示的に解く方程式だけをオーバーライドできることです。

更新(2012年5月2日)

一般的な方程式(内部状態を導入する可能性を含む)を処理する必要がある場合は、方程式の「バランス」の問題にも対処する必要があります。つまり、Modelica(v 3+)には、部分的(インスタンス化不可能)モデルと非部分的モデルの比較に関する特定のセマンティクスが含まれています。重要なのは、定義が本当に部分的であるかどうかを判断するために、コンパイラーに内部で計算されるものと外部で提供されるものに関する十分な情報を提供する必要があるということです。

一般に、潜在的な外部相互作用を記述するために部分的なモデル/ブロックを定義してから、交換可能なコンポーネントを使用して方程式を置き換える必要があります。元の例に基づくと、次のようになります。

package Pkg
  partial block Equations
    input Real y; // Input for any information it will need in the calculation
    output Real x; // Output to indicate something the model will compute
  end Equations;

  block DefaultEquations
    extends Equations;
  equation
    x = 0;
  end DefaultEquations;

  class Base
    replaceable DefaultEquations equations constrainedby Equations;
  end Base;
end Pkg;

model TestEquations
  import Pkg.*;

  block CustomEquation
    extends Equations
  equation
    x*x + y*y = 25.0; // example of non explicit equation
  end CustomEquation;

  class CustomizedClass
    extends Base(redeclare CustomEquation equations);
  end CustomizedClass;

  CustomizedClass customized;
end TestEquations;

私はそれを追加する必要があります(少なくとも上記の例では)、完全に削除することができBaseますCustomizedClass。しかし、私はそれらを残しました。なぜなら、それらはどういうわけかあなたの実際の問題にマッピングされていると思うからです。最後に、私はclass実際のコードでは使用しません(より具体的にしようとします)ので、いくつかの定義をblock定義に変更しました。

于 2012-05-02T07:48:07.677 に答える