私があなたの目標を理解していれば、これを達成するための非常に簡単な方法があります。この代替考えてみましょう:
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
部)の変数に同じように機能します。したがって、変数(変数宣言の後に表示される部分)の「初期化式」を取り、上書きすることができます。このアプローチの限界は、一般的な方程式、単一の変数を明示的に解く方程式を上書きすることができないということです。
更新(5月2日、2012年)
あなたは(内部状態を導入する可能性を含む)の一般式を処理するために必要がある場合は、また、方程式を「均衡」の問題に対処する必要があります。つまり、Modelica(v 3+)には、部分モデル(非インスタンス化可能なモデル)と非部分モデル(non-partial model)との間にあるセマンティクスが含まれています。重要なことは、内部的に何が計算されるかについての十分な情報をコンパイラに与える必要があることと、定義が実際に部分的かどうかを調べるために外部から提供されるものについてです。 。一般的には
、あなたが潜在的な外部の相互作用を記述し、その後に式を置き換えるためにあなたの元の例に基づいて、交換可能なコンポーネントを使用する部分モデル/ブロックを定義する必要があり、それは次のようになります。
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
の定義に変更しました。
明らかに私の例はあまりにも単純で、誤解を招きます。デフォルト方程式は常にx = 0の型です。しかし、ユーザは通常、xを含む非常に複雑な方程式でそれらを上書きしたい。この例のように1つの式をオーバーライドするだけでなく、方程式のシステムをオーバーライドする必要があります。これはあなたの答えをどのように変えますか?いずれにせよ、私はあなたの答えをupvoted。 – Ali
私はなぜ私が答えを得ていないのだろうと思っていた... Apperantlyあなたの更新を逃した、非常に残念です。ご回答有難うございます! – Ali