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