当我使用“in”契约覆盖D中的函数时,将检查继承的“in”契约。如果它们失败,则检查重写的“in”合同。如果我没有在合同中指定任何内容,那么它就会被解释为有一个空的“in”合同。所以下面的代码编译并成功运行。我该如何有意义地在D接口中使用预条件契约?
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语言中的设计错误吗?或者有没有适当的可扩展的方法来做到这一点?
我不确定该文档页是不是只是过时。我不得不看看TDPL,但有一个类似于OP的问题:http://d.puremagic.com/issues/show_bug.cgi?id=6549 – jpf 2012-07-27 18:34:37
@jpf这是一个增强请求。有些人想要改变这个问题的语言。有关当前行为的文档是正确的。 – 2012-07-27 18:38:36
哦,对,我没有意识到这一点。 – jpf 2012-07-28 12:47:19