所有的派生类都应该从它们的基类继承一些默认的公式。当缺省等式对于派生类无效时,它应该重新声明它。下面这个极简主义的例子有点愚蠢。
我是否在实现上述目标的正确轨道上?或者有没有更好的方式在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;发布于 2012-05-02 15:48:08
如果我理解你的目标,有一个非常简单的方法来实现这一点。考虑以下替代方案:
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;如果你不需要所有的继承层,...and会更进一步:
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定义。
https://stackoverflow.com/questions/10380792
复制相似问题