Thread overview
Why do 'abstract' methods with 'in' or 'out' contracts require a body?
Sep 13, 2014
Trey Brisbane
Sep 13, 2014
Marc Schütz
Sep 13, 2014
Trey Brisbane
Sep 13, 2014
bearophile
Sep 13, 2014
KlausAlmaust
September 13, 2014
Hey all,

I have a class method defined like so:

abstract class MyClass {
public:
	@property
	abstract SomeClassType getField() pure nothrow
	out(result) {
		assert(result !is null, "Error: getField() returned null.");
	}
}

As you can see, this method is abstract, as well as in an abstract class. Why, then, do I get the following error when compiling it?

"Error: function module.MyClass.getField in and out contracts require function body"

Is this a compiler bug, or is there a reason for this?

Thanks for your time!
September 13, 2014
On Saturday, 13 September 2014 at 05:07:32 UTC, Trey Brisbane wrote:
> Hey all,
>
> I have a class method defined like so:
>
> abstract class MyClass {
> public:
> 	@property
> 	abstract SomeClassType getField() pure nothrow
> 	out(result) {
> 		assert(result !is null, "Error: getField() returned null.");
> 	}
> }
>
> As you can see, this method is abstract, as well as in an abstract class. Why, then, do I get the following error when compiling it?
>
> "Error: function module.MyClass.getField in and out contracts require function body"
>
> Is this a compiler bug, or is there a reason for this?
>
> Thanks for your time!

I thought it was an error, but then I found this in the documentation:

http://dlang.org/attribute.html#abstract

"Functions declared as abstract can still have function bodies. This is so that even though they must be overridden, they can still provide ‘base class functionality.’"

=> it's intentional
September 13, 2014
On Saturday, 13 September 2014 at 07:32:23 UTC, Marc Schütz wrote:
> I thought it was an error, but then I found this in the documentation:
>
> http://dlang.org/attribute.html#abstract
>
> "Functions declared as abstract can still have function bodies. This is so that even though they must be overridden, they can still provide ‘base class functionality.’"
>
> => it's intentional

Can != must ;)

Interesting fact, but it still looks like a bug to me. The contract shouldn't be forcing a body on an abstract method regardless of whether or not abstract methods are allowed to have bodies.
September 13, 2014
Marc Schütz:

> "Functions declared as abstract can still have function bodies. This is so that even though they must be overridden, they can still provide ‘base class functionality.’"
>
> => it's intentional

But also they can not have.
I don't think it's intentional. I think it's a temporary limitation. Search in Bugzilla.

Bye,
bearophile
September 13, 2014
On Saturday, 13 September 2014 at 07:32:23 UTC, Marc Schütz wrote:
> On Saturday, 13 September 2014 at 05:07:32 UTC, Trey Brisbane wrote:
>> Hey all,
>>
>> I have a class method defined like so:
>>
>> abstract class MyClass {
>> public:
>> 	@property
>> 	abstract SomeClassType getField() pure nothrow
>> 	out(result) {
>> 		assert(result !is null, "Error: getField() returned null.");
>> 	}
>> }
>>
>> As you can see, this method is abstract, as well as in an abstract class. Why, then, do I get the following error when compiling it?
>>
>> "Error: function module.MyClass.getField in and out contracts require function body"
>>
>> Is this a compiler bug, or is there a reason for this?
>>
>> Thanks for your time!
>
> I thought it was an error, but then I found this in the documentation:
>
> http://dlang.org/attribute.html#abstract
>
> "Functions declared as abstract can still have function bodies. This is so that even though they must be overridden, they can still provide ‘base class functionality.’"
>
> => it's intentional

interfaces as well, if the final attribute is specified, which is a nice feature imo, since you reason in the interface scope.