D の関数を "in" コントラクトでオーバーライドすると、継承された "in" コントラクトがチェックされます。それらが失敗した場合、オーバーライドされた「in」コントラクトがチェックされます。コントラクトに何も指定しない場合、空の「イン」コントラクトがあるかのように解釈されます。したがって、次のコードは正常にコンパイルおよび実行されます。
module main;
import std.stdio;
interface I
{
void write( int i )
in
{
assert( i > 0 );
}
}
class C : I
{
void write( int i )
{
writeln( i );
}
}
int main()
{
I i = new C;
i.write( -5 );
getchar();
return 0;
}
コンパイラが正しく実行するのに十分であることが静的にわかっているため、呼び出すときに前提条件のみI.write()
をチェックする必要があります。動的ディスパッチ後にすべての前提条件をチェックすると、カプセル化が失われるため、オブジェクト指向の観点から奇妙に思えます。i.write()
I.write()
前提条件を繰り返したりin { assert( false ); }
、インターフェイスを実装するすべてのクラスに記述したりできますが、それは面倒です。D言語の設計ミスですか?または、それを行うための適切なスケーラブルな方法はありますか?