2012-04-30 18 views
1

すべての派生クラスは、それらの基本クラスからいくつかのデフォルト方程式を継承する必要があります。デフォルトの方程式が派生クラスに対して有効でないときは、それを再宣言する必要があります。以下のこの最小限の例はやや愚かです。デフォルト方程式を上書きする方法は?

私は上記の目標を達成するために適切な道にいるのですか?それとも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; 

答えて

3

私があなたの目標を理解していれば、これを達成するための非常に簡単な方法があります。この代替考えてみましょう:

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; 

私はこれを追加してください(上記の例では少なくとも)BaseCustomizedClassを完全に削除することができます。しかし、私は彼らがあなたの実際の問題に何らかの形で対応していると考えているので、私はそれらを残しました。最後に、実際のコードではclassを使用していません(私はより具体的にしようとしています)ので、定義の一部をblockの定義に変更しました。

+0

明らかに私の例はあまりにも単純で、誤解を招きます。デフォルト方程式は常にx = 0の型です。しかし、ユーザは通常、xを含む非常に複雑な方程式でそれらを上書きしたい。この例のように1つの式をオーバーライドするだけでなく、方程式のシステムをオーバーライドする必要があります。これはあなたの答えをどのように変えますか?いずれにせよ、私はあなたの答えをupvoted。 – Ali

+1

私はなぜ私が答えを得ていないのだろうと思っていた... Apperantlyあなたの更新を逃した、非常に残念です。ご回答有難うございます! – Ali

関連する問題