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;
}
}