如果我了解您的目标,则有一种非常简单的方法可以实现这一目标。考虑这个替代方案:
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
and CustomizedClass
。但我把它们留在里面是因为我认为它们以某种方式映射到你的实际问题。最后,我从不class
在实际代码中使用(我尝试更具体),所以我将您的一些定义更改为block
定义。