2012-04-30 93 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部分)工作在相同的變量,因爲它們的參數做。因此,您可以對任何變量(在變量聲明後出現的部分)採用「初始化公式」並覆蓋。這種方法的侷限性在於,它不會讓您覆蓋一般方程,而只是明確求解單個變量的方程。

更新(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; 

我應該補充一點(至少在上面的例子中),你可以完全消除BaseCustomizedClass。但是我讓他們留下,因爲我認爲他們以某種方式映射到你的實際問題。最後,我從未在實際代碼中使用class(我試圖更具體),因此我將一些定義更改爲block定義。

+0

顯然我的例子太簡單了,因此有誤導性。默認方程總是x = 0的類型。然而,用戶通常希望用非常複雜的涉及x的方程來覆蓋它們。正如在這個例子中,不僅一個方程必須被覆蓋,而是一個方程組。這將如何改變你的答案?無論哪種方式,我upvoted你的答案。 – Ali

+1

我想知道爲什麼我沒有得到答案......很明顯,我錯過了你的更新,非常抱歉。感謝您的回答! – Ali