当我用“in”合约覆盖 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()
编译器正确运行的条件。从 OO 的角度来看,在动态调度之后检查所有先决条件让我觉得很奇怪,因为封装丢失了。
我可以重复前提条件或在所有实现接口的类中编写in { assert( false ); }
,但这很痛苦。这是D语言的设计错误吗?还是有任何适当的可扩展方式来做到这一点?