id:uskzさんと昨晩朝方まで話し込んでしまった.
と言っても,僕の理解力が貧弱すぎただけだが.
契約プログラミング - プログラミング言語 D (日本語訳)in, out と、継承
関数が基底クラスの関数をオーバーライドしたものである時は、 その関数自身かまたは基底クラス達の in 契約のうち、 どれか一つが満たされればよいことになります。 関数のオーバーライドは、 in 契約を より緩く していることになります。
in 契約を持たない関数は、 関数の引数として任意の値を許すという意味になります。これはつまり、 in 契約を持たない関数が継承階層の中にあると、 その関数をオーバーライドした関数の in 契約は何も効果を持たないことになります。
逆に、out 契約は全て満たされる必要がありますから、 関数のオーバーライドは、out 契約を より厳しく していることになります。
オーバーライドするとin契約の集まりがorで結合されるのか.
DbCをほぼ使ってないから知らなかった.
でもまだよくわかってない罠(´・ω・`)
もしも and 結合されたら
class Base { void f(int i) in {/+契約A+/ assert(i > 0); } body {} } class Derived : Base { void f(int i) in {/+契約X+/ assert(i > 1); } body {} } void g(Base v) { v.f(0); // g()を書く人はBaseの契約Aだけを気にしていればいいはずだが? } void main() { g(new Derived); // 実行してみると契約Xに違反してしまう }