Contracts inheritance

Eyyub Eyyub.pangearaion at gmail.com
Mon Apr 16 11:15:46 PDT 2012


On Friday, 13 April 2012 at 22:23:25 UTC, Ali Çehreli wrote:
> 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

Mhh ok thanks.
So, why overrides a contract if the assert is not checked at 
runtime ?

Eyyub,



More information about the Digitalmars-d-learn mailing list