如果我明白你的目標,有一個非常簡單的方法來完成此任務。考慮這個選擇:
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
定義。
顯然我的例子太簡單了,因此有誤導性。默認方程總是x = 0的類型。然而,用戶通常希望用非常複雜的涉及x的方程來覆蓋它們。正如在這個例子中,不僅一個方程必須被覆蓋,而是一個方程組。這將如何改變你的答案?無論哪種方式,我upvoted你的答案。 – Ali
我想知道爲什麼我沒有得到答案......很明顯,我錯過了你的更新,非常抱歉。感謝您的回答! – Ali