Covariant return type

Aarti_pl aarti at interia.pl
Fri Mar 23 06:43:59 PDT 2007


Aarti_pl napisał(a):
> 
> 
> 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)

Fortunately there are mixins in D, so I can "mix in" covariant functions 
to derived classes...

But I still think it is a little bit hackish...

BR
Marcin Kuszczak
(aarti_pl)


More information about the Digitalmars-d-learn mailing list