On 04/13/2012 03:07 PM, Eyyub wrote:
Hai,
After watching Walter's video at Lang.NEXT, I have wanted to know how
contracts inheritance works.
In the following code, I don't understand why foo.bar(2) works...but
with the sames contracts in the foo function it doesn't work.
http://paste.pocoo.org/show/3Ab5IiQk6hTiJ0jAFZWv/
Thanks
Here is the for convenience:
import std.stdio;
interface IFoo
{
void bar(int a)
in
{
assert(a != 1);
}
}
class Foo : IFoo
{
this()
{}
override void bar(int a)
in
{
assert(a != 2);
}
body
{
writeln(a); // 2
}
}
void foo(int a)
in
{
assert(a == 2);
assert(a < 2);
}
body
{
writeln(a);
}
void main()
{
foo(2); // don't pass
Foo foo2 = new Foo;
foo2.bar(2); // pass
}
foo(2) cannot work because of the second assert in the 'in' contract.
foo2.bar(2) passes because passing a single 'in' contract is sufficient.
The 'in' contract of IFoo.bar() requires that a != 1 and it is satisfied
for 2 so bar() can be called with argument 2.
Ali