On Friday, 11 March 2016 at 01:45:36 UTC, Jonathan M Davis wrote:

Sure, but if you're not using in/out contracts with a class, you're not going to see how they interact with inheritance. To mimic what they do, you'd have to duplicate the base class contracts in the derived class and make sure that you ||ed the in contracts correctly and &&ed the out contracts correctly, which isn't very maintainable.

- Jonathan M Davis

If I'm understanding you correctly, you could still get the same behavior with something like below (though it isn't exactly right since Base.foo's in block would technically have a funky rule applied to it).

After playing around with your example, I'm finding in/out blocks on derived classes to be tricky. I think I'm going to try to avoid putting myself in a situation where I would screw something up.

import core.exception;
import std.exception;

class Base
{
        void baseCheck(int i)
        {
                assert(i % 2 == 0, "base out failed");
        }

    int foo(int i)
    {
                assert(i > 0 && i < 10, "base in failed");
                scope(exit) baseCheck(i);

        return i;
    }
}

class Derived : Base
{
    override int foo(int i)
        {
                scope(exit) baseCheck(i);
                
        assert(i < 50, "derived in failed");
                scope(exit) assert(i % 3 == 0, "derived out failed");

        return i;
    }
}

Reply via email to