Covariant return type

Aarti_pl aarti at interia.pl
Thu Mar 22 08:19:53 PDT 2007



Jarrett Billingsley napisał(a):
> "Aarti_pl" <aarti at interia.pl> wrote in message 
> news:ettjqu$14jb$1 at digitalmars.com...
>> Hello!
>>
>> Shouldn't code below work?:
>>
>> //-------------------------------------------
>>
>> abstract class Storage {
>>     Storage get() {
>>         return this;
>>     }
>> }
>>
>> class SpecificStorage : Storage {
>>     void print() {}
>> }
>>
>> void main() {
>>     SpecificStorage s = (new SpecificStorage).get();
>>     s.print;
>> }
>>
>> //-------------------------------------------
>>
>> Unfortunately currently you have to add overridden implementation of get() 
>> in SpecificStorage, like below (what is a little bit tedious work):
>>
>>     SpecificStorage get() {
>>         return this;
>>     }
>>
>>
>> But my intuition about that would be that "this" pointer from method get 
>> from Storage class will point to "SpecificStorage" when there is 
>> instantiated SpecificStorage. But it looks that in fact this points to 
>> "Storage".
> 
> Sounds like it's behaving correctly to me.  When you call .get on a 
> SpecificStorage, the only override of it is the one that returns a Storage 
> in the base class, and you can't cast from Storage to SpecificStorage 
> implicitly.  The language will not implicitly define covariantly returning 
> versions of your methods for you; that's up to you. 
> 
> 

Yes, but in fact I don't want to loose type information and upcast to 
Storage. I just want to return 'this' as it is when return is invoked.

Such a behavior seems a little bit nonsense when there is covariance 
return type feature in programming language. To get covariance I have 
many time reimplement same code in every inherited class just to trigger 
proper behaviour.

I think that it should not break anything when instead of making 
upcasting during return compiler just return concreate type and probably 
later make upcast when e.g. assigning to Storage variable. It should 
also not break visibility as I return SpecificStorage - If I would want 
to return Storage I can make upcast before return even in base class:

Storage get() {
	return cast(Storage)this;
}

....

But maybe I am wrong... Do you think it would be enhancement for 
language to have something like this? Or it can break something?...

I get to this problem with few simple, guarded setters methods in base 
class, which should return 'this' to achieve chaining. They should 
behave exactly same in all derived classes and currently the only way is 
to copy slightly modified implementation to derived classes...

If you think it could be useful I will fill enhancement on bugzilla... 
Or maybe it should be putted for discussion to main D forum? (as it 
doesn't look like error according to answer)...

BR
Marcin Kuszczak
(aarti_pl)


More information about the Digitalmars-d-learn mailing list