首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖默认公式?

如何覆盖默认公式?
EN

Stack Overflow用户
提问于 2012-04-30 16:45:46
回答 1查看 1.2K关注 0票数 1

所有的派生类都应该从它们的基类继承一些默认的公式。当缺省等式对于派生类无效时,它应该重新声明它。下面这个极简主义的例子有点愚蠢。

我是否在实现上述目标的正确轨道上?或者有没有更好的方式在Modelica语言中表达这一点?

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-02 15:48:08

如果我理解你的目标,有一个非常简单的方法来实现这一点。考虑以下替代方案:

代码语言:javascript
复制
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;

但是,如果您愿意消除所有重新声明,则可以进一步简化它:

代码语言:javascript
复制
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会更进一步:

代码语言:javascript
复制
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+)包含了关于部分(不可实例化)模型与非部分模型的某些语义。关键是,您需要向编译器提供足够的信息,说明内部将计算哪些内容,以及外部将提供哪些内容,以便编译器确定定义是否真的是部分定义。

通常,您应该定义一个部分模型/块来描述潜在的外部交互,然后使用可替换的组件来替换中的公式。基于您的原始示例,它可能如下所示:

代码语言:javascript
复制
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;

我应该补充一点(至少在上面的例子中),您可以完全消除BaseCustomizedClass。但我把它们留在里面,因为我假设它们以某种方式映射到您的实际问题。最后,我从来没有在实际代码中使用过class (我试着说得更具体一些),所以我将您的一些定义改为block定义。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10380792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档