Covariant problem

Koroskin Denis 2korden at gmail.com
Thu Jul 24 04:52:14 PDT 2008


On Thu, 24 Jul 2008 15:19:59 +0400, Zarathustra  
<adam.chrapkowski at gmail.com> wrote:

> Steven Schveighoffer Wrote:
>
>>
>> "Zarathustra" wrote
>> > Steven Schveighoffer Wrote:
>> >
>> >> "Zarathustra" wrote
>> >> > error:
>> >> > function basis.CPolygon2d.getPoints of type CPoint2d[]() overrides  
>> but
>> >> > is
>> >> > not covariant with basis.CPolygon3d.getPoints of type CPoint3d[]()
>> >> >
>> >> > I don't know how to fix this problem. What does 'covariant' mean?
>> >>
>> >> Covariant means that the override returns something that can be
>> >> implicitly
>> >> casted to the base version.
>> >>
>> >> So the error looks like the base class function getPoints returns  
>> type
>> >> CPoint3d[], but the derived class is returning CPoint2d[].  In order  
>> for
>> >> this to work, CPoint2d[] must be implicitly castable to CPoint3d[],  
>> which
>> >> probably isn't true.
>> >>
>> >> In order to diagnose the problem exactly, we would have to see  
>> code.  At
>> >> least the class hierarchy.
>> >>
>> >> -Steve
>> >>
>> >>
>> >
>> > Ok, thanks. I understand it now.
>> > CPoint2d class is inherited by CPoint3d. Both classes have same named
>> > functions with this difference that one return CPoint2d object and  
>> second
>> > CPoin3d object. Is possible to extort to call correct function (not  
>> from
>> > parent class). It's strange, because CPoint2d can be casted to  
>> CPoint3d
>> > but not inversely.
>>
>> I'm not quite sure how to interpret your statement.  It might be better  
>> to
>> understand by showing some stub code.
>>
>> Fill in where you see ???:
>>
>> class CPoint2d : ???
>> {
>> }
>>
>> class CPoint3d : ???
>> {
>> }
>>
>> class CPolygon2d : ???
>> {
>>   ???[] getPoints() {}
>> }
>>
>> class CPolygon3d : ???
>> {
>>   ???[] getPoints() {}
>> }
>>
>> -Steve
>>
>>
>
> class CPoint3d{
> }
>
> class CPoint2d : CPoint3d{
> }
>
> class CPolygon3d{
>   CPoint3d [] getPoints() {}
> }
> class CPolygon2d : CPolygon3d{
>   CPoint2d [] getPoints() {}
> }

Well, it *should* work based on current semantics, because CPoint2d[]  
implicitly castable to CPoint3d[]. Moreover, it compiles with D2 but  
doesn't with D1. However, it is error-prone (as I showed previously) and  
is therefore better to avoid. Besides, it's an arguable design to inherit  
CPoint2d from CPoint3d :)


More information about the Digitalmars-d-learn mailing list