...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

契約の継承

id:uskzさんと昨晩朝方まで話し込んでしまった.
と言っても,僕の理解力が貧弱すぎただけだが.

in, out と、継承

関数が基底クラスの関数をオーバーライドしたものである時は、 その関数自身かまたは基底クラス達の in 契約のうち、 どれか一つが満たされればよいことになります。 関数のオーバーライドは、 in 契約を より緩く していることになります。
in 契約を持たない関数は、 関数の引数として任意の値を許すという意味になります。これはつまり、 in 契約を持たない関数が継承階層の中にあると、 その関数をオーバーライドした関数の in 契約は何も効果を持たないことになります。
逆に、out 契約は全て満たされる必要がありますから、 関数のオーバーライドは、out 契約を より厳しく していることになります。

契約プログラミング - プログラミング言語 D (日本語訳)

オーバーライドすると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に違反してしまう
}