私があなたの目標を理解していれば、これを達成するための非常に簡単な方法があります。この代替案を検討してください。
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
定義に変更しました。