On 11/15/17 9:43 AM, Dr. Assembly wrote:
I'm learning to use interface with contracts. In below code, in isn't being "called". Can someone point out why? what am I doing wrong?

void main() {
     C c = new C();
     writeln(c.foo(1));
}

interface I
{
     int foo(int i)
         in { assert(i > 2); }
         out (result) { assert(result != 0); }

     void baa();
}

class C : I
{
     int foo(int i) {
         return i * 2;
     }

     void baa() {
         writeln("Hello!");
     }
}

Not going to defend these design decisions, but according to https://dlang.org/spec/contracts.html#in_out_inheritance:

1. If a function in a derived class overrides a function in its super class, then only one of the in contracts of the function and its base functions must be satisfied. Overriding functions then becomes a process of loosening the in contracts.

2. A function without an in contract means that any values of the function parameters are allowed. This implies that if any function in an inheritance hierarchy has no in contract, then in contracts on functions overriding it have no useful effect.

So simply overriding a function and specifying no in contract cancels all in contracts.

I don't think there's a way to specify inheriting the in contract. I believe the only correct way to do this is to repeat the base's in contract.

-Steve

Reply via email to